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

时间:2018-11-16 12:39:35

标签: c++ class templates constructor

对于标量参数和容器类型参数,我正在用不同的输入类型重载模板类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>()

1 个答案:

答案 0 :(得分:5)

是的,您可以将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>来表示约束的各种库工具。)