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

 

posted @ 2021-03-19 19:26  大笨瓜  阅读(1)  评论(0)    收藏  举报