类模板和多个参数包的模板参数推导

时间:2016-10-14 23:16:24

标签: c++ templates variadic-templates c++17

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

无论如何,它并不完全相同,我不确定是否允许它。

1 个答案:

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

其中???是一系列令牌明确的令牌系列。