【发布时间】:2015-08-23 13:34:30
【问题描述】:
我正在尝试通过 SFINAE 选择构造函数,如下所示:
template<typename T>
class MyClass
{
public:
template<typename C, typename = std::enable_if_t<std::is_class<C>::value>>
MyClass(C) { }
template<typename C, typename = std::enable_if_t<std::is_pointer<C>::value>>
MyClass(C) { }
};
但是编译器报错如下:
错误 C2535: 'MyClass::MyClass(C)': 成员函数已定义或声明
甚至没有实例化构造函数。
我想出了一个可行但丑陋的解决方案,由于额外的未使用参数,我不想使用它:
template<typename T>
class MyWorkingClass
{
public:
template<typename C>
MyWorkingClass(C, std::enable_if_t<std::is_class<C>::value>* = nullptr) { }
template<typename C>
MyWorkingClass(C, std::enable_if_t<std::is_pointer<C>::value>* = nullptr) { }
};
这里给出一个简短的使用示例:
void* ptr = nullptr;
MyClass<int> mc1(ptr);
std::vector<int> vec;
MyClass<int> mc2(vec);
// Shall raise an error
// MyClass<int> mc2(0);
特征std::is_pointer 和std::is_class 只是一个例子,原始特征更复杂。
有没有办法通过SFINAE选择构造函数而不给构造函数添加另一个参数(可能非常接近第一种方法)?
【问题讨论】:
标签: c++ templates c++14 sfinae