具有多个模板参数的C 概念
C++ Concepts with multiple template arguments
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);
为了使这有意义,
p
和q
必须是相同类型的,这是规则。默认情况下,如果对两个参数使用相同的约束参数名称,则这些参数的类型必须相同。我们选择重复使用约束参数名称表示"相同类型",因为(在大多数环境中)是最常见的情况,此处的目的是优化 简要符合最简单的情况。另外,约束参数是名称 一种类型,并且具有两个类型的名称是指同一范围中的不同类型 会导致混乱。
托尼·范·埃德(Tony Van Eerd)和鲍顿(Boton Ballo)提出了改变此含义的建议:p0464。该论文提供了两个支持当前含义的论点,一种类似于Sutton等人,一个正交:
使用频率
。
可以说,您通常不需要一个函数,即在两种类型之间没有附加关系的情况下,具有两个潜在的不同类型的参数。与定义检查
。
的互动 还可以说,此更改将鼓励模板作者编写不受约束的模板,因为即使在参数类型上应该有其他约束,他们也会选择使用TERSER foo(ConceptName, ConceptName);
表格。未约束模板的扩散将使定义更加努力地检查,因为不受约束的模板不会通过定义检查。
我不熟悉任何其他论点,而不是当前的语法,但是如果您是,请随时通过电子邮件将Tony和Botond发送给他们的论文。
只是那些标记此问题或在Google上找到它的人的快速更新。
这里讨论的问题已经解决 - 显然是在2018年3月在杰克逊维尔举行的C 标准会议之前。
顺便说一句,似乎没有太多讨论而解决的一个主题是独立解决方案 vs. 一致的解决方案的问题;也就是说,如果您在AFT中有两种用途(如
void foo(Number, Number);
中),是否需要它们是相同的混凝土类型("一致"),或两种可能建模概念的潜在不同类型("独立"))。概念TS具有一致的解决方案,但许多人更喜欢独立的解决方案。我合着了一篇论文,该论文在不久前争论独立决议;随后,另一篇论文和Sortable{S}
提案的一部分都加强了这种观点。有些娱乐,这个话题从未真正正式讨论和投票。独立决议的想法似乎随着时间的流逝而缓慢地赢得人们的胜利,以至于通过这次会议,这是一项完成的交易,任何进入C 20的船尾提议实际上都将具有独立分辨率。
- 如何反转整数参数包
- 表示"accepting anything for this template argument" C++概念的通配符
- 概念中的cv限定符需要表达式参数列表
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 概念可以与模板模板参数一起使用吗?
- C++20 概念 如何定义带有参数的函数的存在?
- SFINAE 内部概念模板参数
- 在if constexpr中使用带参数包的概念时,升级到gcc 9后出现编译错误
- C++ OOP 基本概念 - 将参数传递给构造函数
- 如何将概念用作模板参数
- 模板 - 网板参数和概念
- 检查可变参数模板函数的概念
- 具有多个模板参数的C 概念
- 概念定义中的多个模板参数
- 我可以知道为什么这个函数的参数不是 int 类型吗?我不明白这里指针的整个概念
- 清除 glVertexAttribPointer 参数的概念
- 函数调用和参数传递中涉及的概念
- 概念精简版将如何与可变参数模板交互
- 使用模板模板参数与概念中的CRTP
- 概念检查函数不适用于仅可移动参数