在C ++ 17中,类模板的模板参数将或多或少地推导出现在的功能模板。
Here是相关文件。
作为上述论文的一个例子:
template<class ... Ts> struct X { X(Ts...) };
X x1{1}; // OK X<int>
X x11; // OK X<>
当演绎发生时,功能模板还有另一个有趣的功能 请考虑以下代码:
template<typename... U, typename... T>
auto func(T&&...) {}
// ...
// U is int, char - T is int, double
func<int, char>(0, .0);
我们可以有两个参数包,只要扣除有助于区分它们 无需将它们包含在元组或其他结构中。
是否可以对类模板执行相同的操作?
举个例子:
template<typename... U, typename... T>
struct S {
S(T&&...) {}
};
// ...
// U is int, char - T is int, double
S<int, char> s{0, .0};
该论文包含以下示例:
template<class ... Ts> struct X { X(Ts...) };
X<int> x3{1, 'a', "bc"}; // OK X<int,char,const char*>
无论如何,它并不完全相同,我不确定是否允许它。
答案 0 :(得分:4)
此:
template<typename... U, typename... T>
struct S { ... };
只是[temp.param]的错误形式:
如果主类模板,主变量模板或别名模板的 template-parameter 是模板参数包,则它应该是最后的模板参数。
这种情况:
template<class ... Ts> struct X { X(Ts...) };
X<int> x3{1, 'a', "bc"}; // OK X<int,char,const char*>
是有问题的,因为X<int>
已经是有效类型。这篇文章的这一部分已经在Oulu中删除了,尽管未来的某些提案可能会指出应该推导出一些类模板参数,但是应该指定其他参数:
X<string, ???> x3{"a", 1, "b"}; // X<string, int, const char*>.
其中???
是一系列令牌明确的令牌系列。