class 模板和多参数包的模板参数推导
Template argument deduction for class templates and multiple parameters packs
在 C++17 中,class 模板的模板参数将或多或少地被推导,就像现在函数模板所发生的那样。
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);
我们可以有两个参数包,只要推导有助于区分它们。
无需将它们包装在元组或其他结构中。
是否可以用 class 模板做同样的事情?
举个例子:
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*>
总之,这不是完全一样的东西,我不确定它是否会被允许。
这个:
template<typename... U, typename... T>
struct S { ... };
根据 [temp.param]:
格式不正确
If a template-parameter of a primary class template, primary variable template, or alias template is a template parameter pack, it shall be the last template-parameter.
本案:
template<class ... Ts> struct X { X(Ts...) };
X<int> x3{1, 'a', "bc"}; // OK X<int,char,const char*>
是有问题的,因为 X<int>
已经是一个有效的类型。这篇论文的这一部分在 Oulu 被删除了,尽管未来的一些提案可能会表明应该推导一些 class 模板参数,但应该指定其他模板参数:
X<string, ???> x3{"a", 1, "b"}; // X<string, int, const char*>.
其中 ???
是一系列表明意图明确的标记。
在 C++17 中,class 模板的模板参数将或多或少地被推导,就像现在函数模板所发生的那样。
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);
我们可以有两个参数包,只要推导有助于区分它们。
无需将它们包装在元组或其他结构中。
是否可以用 class 模板做同样的事情?
举个例子:
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*>
总之,这不是完全一样的东西,我不确定它是否会被允许。
这个:
template<typename... U, typename... T>
struct S { ... };
根据 [temp.param]:
格式不正确If a template-parameter of a primary class template, primary variable template, or alias template is a template parameter pack, it shall be the last template-parameter.
本案:
template<class ... Ts> struct X { X(Ts...) };
X<int> x3{1, 'a', "bc"}; // OK X<int,char,const char*>
是有问题的,因为 X<int>
已经是一个有效的类型。这篇论文的这一部分在 Oulu 被删除了,尽管未来的一些提案可能会表明应该推导一些 class 模板参数,但应该指定其他模板参数:
X<string, ???> x3{"a", 1, "b"}; // X<string, int, const char*>.
其中 ???
是一系列表明意图明确的标记。