如何理解C++20中的Concepts

发布时间:2021-11-23 10:11:38 作者:柒染
来源:亿速云 阅读:192

本篇文章给大家分享的是有关如何理解C++20中的Concepts,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

强大的泛型编程

基本上从C++语言出现开始,泛型编程就是C++的重要组成部分之一。使用编程,可以在实现一次编程多次使用的同时,又不会损失精度。简直就是完美。例如我们可以实现一个简单的、可以处理多种数据类型的模板加法函数:


template<typename T>T add(T in1, T in2){    return in1 + in2;}

有了这个模板函数之后,可以使用它处理各种数据类型。例如:


std::cout << add(1, 3) << std::endl;std::cout << add(2.0, 4.0) << std::endl;

编译器可以根据输入数据的类型自动生成下面的函数(可能不严密),从而避免代码冗余。


int add(int in1, int in2){    return in1 + in2;}double add(double in1, double in2){    return in1 + in2;}

泛型编程在实现和算法相关的处理时特别有用。C++标准库中的容器,算法等功能库中,大量使用的泛型编程。

困难的泛型编程

如果只是使用C++标准库中的容器、算法的话,一般不会遇到太大的问题。一旦自己要设计、开发和调试模板库,就会立即遭遇泛型编程的首要难题:问题的判断、解决都很困难。作者本人就有过由于实在难于调试,因此先改回一般函数,调试完成后再转成模板方式的经历。例如我们另外设计一个复数类:


class Complex{public:    double real = 0;    double imaginary = 0;};

同样对它调用add函数:


std::cout << add(Complex{ 1,2 }, Complex{ 2,-3 });

编译之后,开发环境显示如下:

如何理解C++20中的Concepts

信息的内容主要有:

出错的位置是代码第22行。由于这个模板函数已经可以用于整数和双精度数,错误的原因不在模板函数本身,而是在调用模板时使用实际数据Complex。但问题是错误信息并没有提示是哪个调用出的问题。

另外,错误信息显示没有匹配的+操作符,这是真正的原因。但是接下来Complex没有从各种类继承等附注信息就只有添乱了。作者相信只要使用过泛型编程的程序员都会有过类似的经历。

对策很简单,重载一个针对Complex的+运算符就行了。

C++20新特性之Concept

很快就会正式发布的C++20引入了一个新特性-Concept。简单讲就是描述模板参数的特性和要求。例如对于add模板函数来讲,我们要求模板参数是可以执行加法运算的,这是可以定义下面的Concept:


template<typename T>concept Addable = requires (T obj) {{obj + obj}->std::same_as<T>;};

concept Addable声明名为Addable的概念。

requires用来描述各种需求,它的参数有点像函数的参数定义,参数的类型可以是模板参数(例如T),也可以是已经定义的其他类型。参数名obj的作用类似变量,会在需求描述中使用。

{obj+obj}描述加法运算,它的涵义是T类型的对象obj需要支持加法运算,而花括号后面的->所指的是花括号中的运算结果应该满足的条件,这里使用了标准库中的same_as约束,要求结果类型和T是一样的。

简单说来,就是T类型应该支持加法运算,而且结果类型还是T。

定义Concept之后,模板函数这样写:

template<Addable T>T add(T in1, T in2){    return in1 + in2;}

唯一的变化就是将typename T改成了Addable T,表明这个T是要符合Addable概念的。引入的Concept之后,同样的问题,显示的错误信息完全不同:

如何理解C++20中的Concepts

出错的位置从模板函数内部变成了调用模板函数的代码(58行)。软件规模变大之后,快速定位引发问题的位置特别重要。

错误提示也很清晰,都是说没有满足特定的约束条件。没有任何干扰信息。

以上就是如何理解C++20中的Concepts,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

推荐阅读:
  1. Concepts:Request 和 Task
  2. Socket Basic Concepts

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ concepts

上一篇:如何进行iptables的使用

下一篇:c语言怎么实现含递归清场版扫雷游戏

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》