定义概念时是否允许OR(`||`)?

时间:2015-08-27 12:31:22

标签: c++ c++-concepts

我看到许多使用&&定义的“复合”概念示例,但没有使用||。这让我想知道使用||是否有意义。在我看来,使用||将允许指定一个具有类似于重载(即ad-hoc多态)的效果的概念,但具有一组封闭的可能性。

对于一组“原始”概念C1,...,CN,写入

是否有效
 C1 || ... || CN

作为“复合”概念?

2 个答案:

答案 0 :(得分:3)

来自cpprenference

  

<强>约束

     

约束是指定的一系列逻辑运算   模板参数的要求。他们可以出现在   requires-expressions(见下文)并直接作为概念的主体   有9种类型的约束:

     
      
  1. 连词
  2.   
  3. 析取
  4.   
  5. 谓词约束
  6.   
  7. 表达式约束(仅在requires-expression中)
  8.   
  9. 类型约束(仅在requires-expression中)
  10.   
  11. 隐式转换约束(仅在requires-expression中)
  12.   
  13. 参数推导约束(仅在requires-expression中)
  14.   
  15. 异常约束(仅在requires-expression中)
  16.   
  17. 参数化约束(仅在requires-expression中)
  18.   

并且

  

<强>析取

     

约束P和Q的分离被指定为P || Q.   如果满足任一约束,则满足两个约束的分离。从左到右评估析取和短路(如果满足左约束,则不尝试将模板参数推导到正确的约束中)。用户定义的运算符||重载在约束析取中不允许使用。

答案 1 :(得分:2)

您可以在约束中使用几乎任何常量表达式(包括||)。唯一的限制是这些表达式必须返回bool

||的一个用途是定义已知共享公共接口的类型集。例如,积分(std::is_integral)可以定义为许多相同类型约束(is_same<T, int>)的分离。我不建议这样做。您应该以加法的方式定义概念。