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