所在的位置: C++ >> C++介绍 >> requires表达式C2

requires表达式C2

北京中科医院正规吗 http://pf.39.net/bdfyy/bdfzd

requires还可以接一个表达式,该表达式也是一个纯右值表达式,表达式为true时满足约束条件,false则不满足约束条件

requires表达式的判定标准:对requires表达式进行模板实参的替换,如果替换之后出现无效类型,或者违反约束条件,则值为false,反之为true

templateclassTconceptCheck=requires{T().clear();};templateCheckTstructG{};Gstd::vectorcharx;//成功Gstd::stringy;//成功Gstd::arraychar,10z;//失败

失败原因

由于std::array没有clear操作,所以编译失败

除此之外,我们还可以使用更灵活的方式,进行更多的限定:

templateclassTconceptCheckType=requires(Ta,Tb){a.clear();a+b;};templateclassCheckTypestructA{};

在上面的requires表达式中,a.clear()和a+b可以说是对模板实参的两个要求,这些要求在C++标准中称为要求序列(requirement-seq)。要求序列分为4种,包括简单要求、类型要求、复合要求以及嵌套要求

简单要求simplerequirements

只要语法正确就行,编译器不会计算其结果

templateclassTconceptCheck=requires(Ta,Tb){a+b;//并不要求满足object+object,即使传入array也可以通过};

templateclassTconceptC=requires(Ta){std::is_pointerT::value;//事实上,并不需要是一个指针a++;};类型要求typerequirements

类型要求是以typename关键字开始的要求,紧跟typename的是一个类型名,通常可以用来检查嵌套类型、类模板以及别名模板特化的有效性。如果模板实参替换失败,则要求表达式的计算结果为false

templatetypenameT,typenameT::type=0structS;templatetypenameTusingRef=T;templatetypenameTconceptC=requires{typenameT::inner;//要求嵌套类型typenameST;//要求类模板特化typenameRefT;//要求别名模板特化};templateCcstructM{};structH{usingtype=int;usinginner=double;};MHm;

概念C中有3个类型要求,分别为T::inner、ST和RefT,它们各自对应的是对嵌套类型、类模板特化和别名模板特化的检查。请注意代码中的类模板声明S,它不是一个完整类型,缺少了类模板定义。但是编译器仍然可以编译成功,因为标准明确指出类型要求中的命名类模板特化不需要该类型是完整的。

复合要求


转载请注明:http://www.aierlanlan.com/rzfs/505.html

  • 上一篇文章:
  •   
  • 下一篇文章: