Concepts-Lite如何与可变参数模板交互?

时间:2013-09-15 11:19:46

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

我在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}}? (两者相似但彼此不相同)

好奇的人想知道。

2 个答案:

答案 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中的方法相同,但概念设施可能有更好的方法。