joa*_*dre 3 c++ templates constructor class
A对于标量和容器类型的参数,我正在重载具有不同输入类型的模板化类的构造函数:
template<typename T>
class A {
public:
A();
A(T&& _val) { printf("non-template constructor\n");} ;
template<typename iT> A(const iT& _cont) { printf("template constructor\n");};
};
int main(int argc, char const *argv[]) {
A<float> foo1(0.9); //template constructor
A<float> foo2((float)0.9); //no-template constructor
A<float> foo3(std::vector<int>(5,8)); //template constructor
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,有没有办法在隐式可转换类型上调用非模板构造函数,例如传递double给构造函数A<float>()?
是的,您可以在构造函数模板中添加SFINAE约束:
template<typename iT,
std::enable_if_t<!std::is_convertible_v<iT&&, T>>* = nullptr>
A(const iT&) { printf("template constructor\n"); }
Run Code Online (Sandbox Code Playgroud)
这会导致iT在iT&&可转换时导致推导类型的替换失败T,从而从重载集中删除构造函数模板.
(您需要#include <type_traits>用于表示约束的各种库工具.)
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |