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

3
在C++17中,类模板的模板参数将会像函数模板一样被推导。
这里是相关文件。
以下是来自上述文件的示例:
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个回答

4

This:

template<typename... U, typename... T>
struct S { ... };

这只是根据[temp.param]格式不正确:

如果主类模板、主变量模板或别名模板的模板参数是模板参数包,则该模板参数包应该是最后一个模板参数

这种情况:

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

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


那么答案是 - 不行,它不会被允许,对吗? - skypjack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接