如何仅当两个类型均为std::complex或均非时启用模板类方法?
解决方案
首先先定义一个类型 trait 用来判断某个类型是不是 std::complex:
#include <complex> #include <type_traits> template<typename U> struct is_complex : std::false_type {}; // 特化版本,匹配所有std::complex实例 template<typename U> struct is_complex<std::complex<U>> : std::true_type {};
接下来修改你的类模板,用std::enable_if给成员函数加上约束,只允许T和T2同为std::complex类型,或者都不是的情况:
template<typename T> class M { public: template<typename T2, typename = std::enable_if_t<is_complex<T>::value == is_complex<T2>::value>> void method(T2 arg) { // 函数实现 } };
逻辑说明
is_complex<T>::value会返回true如果T是std::complex的任意实例,否则返回false。我们要求T和T2的这个布尔值必须相等,刚好满足你要的“同是或同非”的条件:
- 如果T是
std::complex<float>,只有当T2也是std::complex<U>(比如std::complex<double>)时,函数才会启用; - 如果T是
int,只有当T2不是std::complex的任意实例时,函数才会启用。
测试示例
int main() { M<std::complex<float>> m1; m1.method(std::complex<double>{}); // 合法:都是complex类型 // m1.method(1); // 编译错误:T是complex,T2不是 M<int> m2; m2.method(2); // 合法:都不是complex类型 // m2.method(std::complex<float>{}); // 编译错误:T不是complex,T2是 }
内容的提问来源于stack exchange,提问作者Patrick B.
相关产品推荐
相关产品推荐

