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*>.

其中 ??? 是一系列表明意图明确的标记。