ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++20 Concept(概念)语法简介

2021-12-18 17:33:40  阅读:331  来源: 互联网

标签:Comparable concept 20 C++ Addable Concept template 子句 requires


快速上手

#include <iostream>
using namespace std;

// 定义Addable概念,要求类型可以进行加运算
template <typename T>
concept Addable = requires (T x) {
	x + x; 
};

// 要求类型T具有Addable特性
template <typename T>
requires Addable<T>
void f(T x)
{
	return x + x + x;
}


int main()
{
	cout << f<int>(10) << endl; //通过
	cout << f<vector>(vector()) << endl; // 编译不通过
	return 0;
}

concept和requires子句

可以像定义函数一样定义requires子句,编译时会检查类型T是否满足子句内所有语句的语法

template <typename T>
concept Addable = requires (T x) {
	x + x; 
};

标准库中的concept

对于常见的concept,C++标准库提供了,如整数概念

template <typename T>
concept Integer = std::is_integral<T>::value;

concept的组合

可以使用 &&|| 来组合两个概念,正如字面意思

#include <iostream>
using namespace std;

// 加法
template <typename T>
concept Addable = requires (T x) {
	x + x;
};

// 小于等于
template <typename T>
concept Comparable = requires (T x) {
	x <= 2;
};

template <typename T>
requires Addable<T> && Comparable<T> //同时使用Addable和Comparable
T fib(T x)
{
	return x<=2? x : fib(x-1)+fib(x-2);
}

int main()
{
	cout << fib<int>(20) << endl;
	return 0;
}

concept不是为了给代码增加障碍

尽管上面的例子中的Addable看起来就是在为传参增加一道门槛,但Addable这种concept不是ISO C++制定concept这个语法的初衷,甚至是典型的违背初衷的concept:

与语法限制相反,指定有意义语义的能力是真正的概念的决定性特征。

标签:Comparable,concept,20,C++,Addable,Concept,template,子句,requires
来源: https://www.cnblogs.com/winterreisender/p/15705535.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有