C++20 概念与约束
C++20新加了关键字concept 和 requires ,下面说一下这两个关键字是如何使用的。
首先说明的是,这两个关键字是针对模板的,非模板类型的函数,类,不能使用,下面我们看一段代码:
template<typename C>
concept check_iter = requires(C val)
{
val.begin() = val.end();
};
这段代码的意思就是如果val具有begin()函数和end()函数,那么check_iter 就为true;
requires 指定了一组表达式,如果表达式成立,那么返回true,否则返回false;
再来看一点代码:
template<typename T>
concept sad = false;
template<typename T>constexpr void foo() requires (sad<T>) // 当表达式为真的时候调用该函数
{
}
template<typename T> constexpr int foo() requires (!sad<T>) && true
{
return 1;
}
我们首先定义了一个概念变量sad,并且在函数的后面添加了requires表达式,那么该表达式起到的作用就是,当该表达式为真的时候,该模板函数有效,什么叫有效呢?就是可以实例化。否则该模板函数无效,不能实例化。我们再来看一段代码:
template<typename T>
requires(sizeof(int) == sizeof(T)||sizeof(T)==sizeof(char))
void fun()
{
}
这段代码我们在函数的前一部分写了requires表达式,同样这也是一个约束函数,当表达式为真时,函数可以实例化,否则该函数不能实例化。
需要注意的是:1.concept 概念变量必须是一个bool类型。2.概念变量可作为模板参数继续抽象,比如 template<typename T> concept A=true; template<A s> .... s x;定义一个约束变量。
欢迎你加入我的群聊,共同探讨C++新技术:636737528

浙公网安备 33010602011771号