如何调用模板类的模板ctor?

时间:2017-05-05 15:37:55

标签: c++ templates syntax constructor type-deduction

template<typename T>
struct A
{
    template<typename U>
    A() {}

    template<typename U>
    static void f() {}
};

int main()
{
    A<int>::f<int>(); // ok
    auto a = A<int><double>(); // error C2062: type 'double' unexpected
}

这个问题在代码中是不言而喻的。

我的问题是:

如何调用模板类的模板ctor?

2 个答案:

答案 0 :(得分:5)

您不能直接调用类的构造函数。如果你不能从调用中推断出构造函数的模板参数,那么就不可能调用那个特定的构造函数。

你可以做的是创建一些类型的包装器,可用于零开销扣除:

template <typename T>
struct type_wrapper { };

template<typename T>
struct A
{
    template<typename U>
    A(type_wrapper<U>) {}
};

int main()
{
    auto a = A<int>(type_wrapper<double>{});
}

live example on wandbox

答案 1 :(得分:3)

  

如何调用模板类的模板ctor?

不幸的是,这是不可能的;您无法为构造函数模板显式指定模板参数。

§17.5.2/5 Member templates [temp.mem]

(强调我的)

  

[注意:因为显式模板参数列表遵循   函数模板名称,因为转换成员函数   不带调用模板和构造函数成员函数模板   使用函数名称,无法提供显式模板   这些功能模板的参数列表。 - 结束注释]