代码之家  ›  专栏  ›  技术社区  ›  tangy

概念需求中的析取

  •  2
  • tangy  · 技术社区  · 7 年前

    requires expression 通常看起来像: requires ( parameter-list(optional) ) { requirement-seq } .

    是否可以不使用 requires constraint-expr . 例如:

    template<typename T> concept FooBarExpert = 
    requires(T a, T b) { 
        {a.foo(b)} || {a.bar(b)}; // Req 1
        { a.baz() }; // Req 2
        // and onward
    }; 
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Oliv    7 年前

    概念被分解为 原子约束 通过一个称为 约束规范化 描述于 temp.constr.normal .

    只有:

    • 逻辑和 && ,
    • 逻辑或 || ,
    • 带圆括号表达式 ()
    • 窗体的ID表达式 C<A1, A2, ..., An> ,其中c命名一个概念

    被分解了。所有其他表达式都是 原子约束 .

    所以A 需要表达式 作为一个整体,是一个原子约束。在概念TS中, 需要表达式 被分解,但在C++ 20中它们不是。 就我所记得的,我刚刚阅读了C++委员会关于概念的所有论文,原因是要求表达式规范化可能导致复杂性爆炸,这可能会惩罚编译速度。

    所以:

    requires(T a, T b) { 
        requires requires(T a, T b){a.foo(b)} 
              || requires(T a, T b){a.bar(b)}; // Req 1
        { a.baz() }; // Req 2
        // and onward
    }; 
    

    是一个 原子约束 . 和

      requires(T a, T b) { 
        {a.foo(b)} 
        { a.baz() }; // Req 2
         // and onward
        }
    || requires(T a, T b) { 
         {a.bar(b)} 
         { a.baz() }; // Req 2
          // and onward
         };
    

    是两个原子约束的分离。(二) 需要表达式 )

    最后:

         ( requires(T a, T b) { a.foo(b); } || requires (T a, T b) { a.bar(b); } )
      && requires(T a, T b) { a.baz(); /* and onward */};
    

    是与原子约束分离的连接。

        2
  •  2
  •   jcarpenter2    7 年前

    定义 FooBarExpert 作为适当的连接(或分离)需要表达式。

    template<typename T> concept bool FooBarExpert =
    ( requires(T a, T b) {
        { a.foo(b) };
      } ||
      requires(T a, T b) {
        { a.bar(b) };
      }
    ) &&
    requires(T a, T b) {
      { a.baz() };
    };