【问题标题】:Concept with multiple template arguments具有多个模板参数的概念
【发布时间】:2020-04-26 16:13:02
【问题描述】:

我正在尝试使用 C++20 概念来开始熟悉它们。 我对简单的概念感觉很舒服,例如使用标准概念movable 我可以写这样的东西(在所有示例中,我想我是using namespace std,我包括<concepts> 和任何其他需要的标题):

template<movable T>
int foo (T obj);

并确保在调用此函数时传递的对象obj 可以移动。 我什至可以写成更长的形式:

template<typename T>
requires movable<T>
int foo (T obj);

结果是一样的(我认为)。

但是现在让我们看看另一个概念,例如same_assame_as 需要 2 个模板参数(要比较的 2 种类型),所以我可以这样写:

template<typename T>
requires same_as<T, string>
int bar (T obj);

现在 T 是 string。但是我怎样才能用更短的形式来写呢?我试过了,我可以写这个(正如我直觉预期的那样):

template<same_as<string> T>
int bar (T obj);

但是这种形式背后的正式规则是什么?

函数模板参数的名称 (T) 是否作为概念模板的第一个参数输入?或者也许是最后一次?我不知道,关于这个主题的信息很少。我的意思是,在这个例子中它是无关紧要的,因为 same_as&lt;A, B&gt; is semantically equivalentsame_as&lt;B, A&gt;,但在某些情况下,顺序很重要。


我知道有类似标题的问题,例如this one,但它问的是不同的东西。

这些是我试图从中获取信息但失败的资源:@​​987654323@、cppModernesopen-std (I browsed years 2018, 2019 and 2020)this post

【问题讨论】:

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


    【解决方案1】:

    但是这种形式背后的正式规则是什么?

    [temp.param]/4 中描述了规则(您猜对了):

    type-constraint Q 指定概念 C 可用于使用 constraint-expression 约束上下文确定的类型或模板类型参数包 T E 定义如下。 如果Q 的形式为C&lt;A1, ⋯, An&gt;,则令E′C&lt;T, A1, ⋯, An&gt;。 否则,设E′C&lt;T&gt;。 如果T 不是包,则EE′,否则E(E′ &amp;&amp; ...)。 这个约束表达式 E 被称为Q立即声明的约束 对于Ttype-constraint 指定的概念应为类型概念([temp.concept])。

    后面段落中的例子:

    type-constraint 开头的 type-parameter 为参数引入了立即声明的 type-constraint 约束。 [ 例子:

    template<typename T> concept C1 = true;
    template<typename... Ts> concept C2 = true;
    template<typename T, typename U> concept C3 = true;
    
    template<C1 T> struct s1;               // associates C1<T>
    template<C1... T> struct s2;            // associates (C1<T> && ...)
    template<C2... T> struct s3;            // associates (C2<T> && ...)
    template<C3<int> T> struct s4;          // associates C3<T, int>
    template<C3<int>... T> struct s5;       // associates (C3<T, int> && ...)
    

    ——结束示例 ]

    您也可以将template &lt;C T&gt; 视为template &lt;C&lt;&gt; T&gt; 的简写,然后类型参数T 总是插入到概念的第一个参数中。

    【讨论】:

    • 完美,非常感谢,从昨天开始我一直在努力寻找该规则的正式确认。所以 name 成为第一个参数。我会保存您指向我的网站,它非常完美,我在 Google 上的搜索中从未找到它。谢谢!
    • @Lapo 是的,该站点是最新 C++ 工作草案的 HTML 版本。当您想查看标准所说的内容时,可以参考一下(而且一切都很好,链接也很好)。
    • 是的,确实做得很好。很遗憾,它从未出现在 Google 搜索的首页上。非常有趣的发现!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多