具有多个模板参数的C 概念

C++ Concepts with multiple template arguments

本文关键字:参数 概念      更新时间:2023-10-16

bjarne Stroustrup最近发布了一份有关C 概念的报告,他提到了一些对我来说似乎令人惊讶的东西。示例(第7.1节)使用"速记模板符号",从本质上讲是这样的:

void foo1(auto x,auto y);                // x and y may have different types  (1)
void foo2(SomeConcept x,SomeConcept y);  // x and y must have the same type   (2)

对我个人而言,这似乎非常违反直觉;实际上,我希望foo2接受不同类型的值x,y,只要各自的类型满足体形概念。请注意,程序员始终可以通过编写以下内容来明确指定他的意图:

template <SomeConcept T> void foo2(T x, T y);                   // (3)
template <SomeConcept T1,SomeConcept T2> void foo2(T1 x,T2 y);  // (4)

直觉上,我希望(2)的速记符号等同于(4),因此与无约束模板(1)的含义更加一致。有人可以阐明此事并解释此设计背后的理由吗?

一些言论:

  • afaik,通用lambdas(在C 14中)已经允许使用类似于(1)的语法。因此,一致性决定(1)应接受具有不同类型的输入变量,因为通用lambdas会这样做。
  • Stroustrup在此类模板的上下文中提到了经典的"迭代对"。但是,我认为这是一个相当薄弱的论点,因为(i)这只是一个用例。

我可以找到的最早的论文在当前概念提案的上下文中提到了TERSE语法为N3580,在§6.2.2中提供了此理由:

如果我们需要同一概念的两种参数类型怎么办?考虑

void sort(Ran p, Ran q);

为了使这有意义,pq必须是相同类型的,这是规则。默认情况下,如果对两个参数使用相同的约束参数名称,则这些参数的类型必须相同。我们选择重复使用约束参数名称表示"相同类型",因为(在大多数环境中)是最常见的情况,此处的目的是优化 简要符合最简单的情况。另外,约束参数是名称 一种类型,并且具有两个类型的名称是指同一范围中的不同类型 会导致混乱。

托尼·范·埃德(Tony Van Eerd)和鲍顿(Boton Ballo)提出了改变此含义的建议:p0464。该论文提供了两个支持当前含义的论点,一种类似于Sutton等人,一个正交:

使用频率
可以说,您通常不需要一个函数,即在两种类型之间没有附加关系的情况下,具有两个潜在的不同类型的参数。

与定义检查
的互动 还可以说,此更改将鼓励模板作者编写不受约束的模板,因为即使在参数类型上应该有其他约束,他们也会选择使用TERSE R foo(ConceptName, ConceptName);表格。未约束模板的扩散将使定义更加努力地检查,因为不受约束的模板不会通过定义检查。


我不熟悉任何其他论点,而不是当前的语法,但是如果您是,请随时通过电子邮件将Tony和Botond发送给他们的论文。

只是那些标记此问题或在Google上找到它的人的快速更新。

这里讨论的问题已经解决 - 显然是在2018年3月在杰克逊维尔举行的C 标准会议之前。

顺便说一句,似乎没有太多讨论而解决的一个主题是独立解决方案 vs. 一致的解决方案的问题;也就是说,如果您在AFT中有两种用途(如void foo(Number, Number);中),是否需要它们是相同的混凝土类型("一致"),或两种可能建模概念的潜在不同类型("独立"))。概念TS具有一致的解决方案,但许多人更喜欢独立的解决方案。我合着了一篇论文,该论文在不久前争论独立决议;随后,另一篇论文和Sortable{S}提案的一部分都加强了这种观点。有些娱乐,这个话题从未真正正式讨论和投票。独立决议的想法似乎随着时间的流逝而缓慢地赢得人们的胜利,以至于通过这次会议,这是一项完成的交易,任何进入C 20的船尾提议实际上都将具有独立分辨率。