11

我在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类型,因此包可能同时包含intstring?(两者都可以比较,但不能相互比较)

好奇的人想知道。

4

2 回答 2

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);

因为

“默认情况下,如果您对两个参数使用相同的约束参数类型名称,则这些参数的类型必须相同。我们选择重复使用约束参数类型名称意味着“相同类型”,因为(在大多数环境中) 是最常见的情况,如果在一个范围内使用两次的标识符有两种不同的含义会很奇怪,这里的目的是优化最简单情况的简洁表示法。”

但是我看不出如何maximum使用当前的('14)模板语法将其扩展为您的。在提议的 n3701 标准措辞变更中,它只谈到了简单的情况

§7.1.6.5 约束类型说明符 [dcl.spec.constrained]

...

在范围内第一次使用概念名称部分概念 ID将该名称绑定到占位符类型,以便随后使用相同名称引用相同类型。

但它并没有解释可变参数的相互作用。也许需要等待第三次修订来澄清这一点。

于 2013-09-15T11:40:04.633 回答
6

我不知道N3580是否是概念文件的最新版本,但在 4.5.1 中,它似乎描述了类型要求如何与可变参数列表一起使用。看起来

template <Comparable... T>
auto maximum(T... values) -> <return-type-goes-here>

将要求每个参数都满足Comparable要求,但没有限制类型T...都相同。这一要求将需要单独实施。顺便说一句,我知道如何强加相同类型要求的唯一方法是与 C++11 中的方法相同,但概念工具可能有更好的方法。

于 2013-09-15T12:28:50.270 回答