模板化构造函数中的模板参数数

时间:2014-09-16 10:17:05

标签: c++ templates c++11 language-lawyer c++14

对于(可能是非模板化的)类,我可以使用模板化构造函数:

struct A {
    template<class T> A(T const& arg) {}
}

模板参数的数量是否受可推断出的参数数量的限制?如果是,那么相关的标准报价是什么?

例如,如果构造函数是

template<class T1, class T2> A(T2 const& arg) {}

此调用会导致编译错误

A<int>(double()); // creation of a temporary

或者如何调用构造函数?这也失败了:

A::A<int>(double()); // creation of a temporary

2 个答案:

答案 0 :(得分:6)

标准中有一个注释,您不能在构造函数中使用显式模板参数:

  

[注意:因为显式模板参数列表遵循函数模板名称,   并且因为调用了转换成员函数模板和构造函数成员函数模板   如果不使用函数名,则无法为这些名称提供显式模板参数列表   功能模板。 - 后注]

资料来源:来自N3337草案的14.5.2 Member templates

但是当然你可以拥有比构造函数参数更多的构造函数模板参数 - 只要它们可以从构造函数参数中推导出来:

示例:

struct A {
    template<class T, int N> A(T (&arg)[N]) {}
};

答案 1 :(得分:4)

您无法使用 template-argument-list 语法传递类型这一事实并不一定意味着您根本无法传递模板化构造函数的类型列表:

template <typename...>
struct _ {};

struct A
{
    template <class T1, class T2, class T3>
    A(_<T1, T2, T3>) {}
};

int main()
{
    A a{_<int, double, char>{}};
}

LIVE DEMO