我在Going Native 2013观看了Bjarne Strustrup的演讲,他为即将到来的C ++概念精简版提供了以下示例。
void sort(Container& c); // terse notation
// Expands to
template <Container __Cont>
void sort(__Cont& c); // shorthand notation
// Expands to
template <typename __Cont>
requires Container<__Cont>()
void sort(__Cont & c);
我的问题是如何使用可变参数模板?
假设我想使用maximum
概念定义可变参数Comparable
函数。是否接受以下语法?
auto maximum(Comparable a)
{
return a;
}
auto maximum(Comparable c, Comparable... rest)
{
return std::max(a, maximum(rest...));
}
如果是这样,Comparable...
意味着参数包中的所有元素都是相同的类型,或者只是它们都是Comparable
类型,以便包可以包含int
和{ {1}}? (两者相似但彼此不相同)
好奇的人想知道。
答案 0 :(得分:7)
我认为简洁格式的目的是要求包中的所有元素必须是相同的类型。这是从n3701§5.3中的示例得出的,该示例声明了
void sort(Random_access_iterator p, Random_access_iterator q);
应该相当于
template<Random_access_iterator __Ran>
void sort(__Ran p, __Ran q);
因为
“默认情况下,如果使用相同的约束参数 两个参数的类型名称,这些参数的类型必须相同。 我们选择重复使用约束参数类型名称暗示 “相同类型”,因为(在大多数环境中)是最常见的情况, 在一个范围内使用两次的标识符有两个不同是很奇怪的 意思是,这里的目的是优化最简单案例的简洁表示法。“
但我不知道如何使用当前('14)模板语法将其扩展到maximum
。在n3701中提出的标准措辞的改变中,它只讨论了简单的案例
§7.1.6.5约束类型说明符[dcl.spec.constrained]
...
在范围内首次使用概念名称或 partial-concept-id 会将其绑定 命名为占位符类型,以便后续使用相同名称引用 相同的类型。
但它并没有解释可变参数的相互作用。也许需要等待第3次修订才能澄清这一点。
答案 1 :(得分:6)
我不知道N3580是否是概念文件的最新版本,但在4.5.1中似乎描述了类型需求如何与可变参数列表一起使用。似乎
template <Comparable... T>
auto maximum(T... values) -> <return-type-goes-here>
要求每个参数满足Comparable
要求,但类型T...
没有任何限制。这项要求需要单独强制执行。另一方面,我知道如何强加相同类型要求的唯一方法与C ++ 11中的方法相同,但概念设施可能有更好的方法。