gpt4 book ai didi

c++ - 如何隐式转换模板化构造函数参数?

转载 作者:太空狗 更新时间:2023-10-29 20:33:44 25 4
gpt4 key购买 nike

我正在重载模板类的构造函数 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;
}

但是,有没有办法在隐式可转换类型上强制调用非模板构造函数,例如通过 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"); }

这会导致推导类型的替换失败 iT什么时候iT&&可转换为 T , 它从重载集中删除了构造函数模板。

(您需要 #include <type_traits> 用于表达约束的各种图书馆设施。)

关于c++ - 如何隐式转换模板化构造函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53338106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com