真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何理解C++20中的Concepts

本篇文章給大家分享的是有關(guān)如何理解C++20中的Concepts,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

在四平等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),成都全網(wǎng)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站制作,四平網(wǎng)站建設(shè)費(fèi)用合理。

強(qiáng)大的泛型編程

基本上從C++語(yǔ)言出現(xiàn)開(kāi)始,泛型編程就是C++的重要組成部分之一。使用編程,可以在實(shí)現(xiàn)一次編程多次使用的同時(shí),又不會(huì)損失精度。簡(jiǎn)直就是完美。例如我們可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的、可以處理多種數(shù)據(jù)類型的模板加法函數(shù):

templateT add(T in1, T in2){    return in1 + in2;}

有了這個(gè)模板函數(shù)之后,可以使用它處理各種數(shù)據(jù)類型。例如:

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

編譯器可以根據(jù)輸入數(shù)據(jù)的類型自動(dòng)生成下面的函數(shù)(可能不嚴(yán)密),從而避免代碼冗余。

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

泛型編程在實(shí)現(xiàn)和算法相關(guān)的處理時(shí)特別有用。C++標(biāo)準(zhǔn)庫(kù)中的容器,算法等功能庫(kù)中,大量使用的泛型編程。

困難的泛型編程

如果只是使用C++標(biāo)準(zhǔn)庫(kù)中的容器、算法的話,一般不會(huì)遇到太大的問(wèn)題。一旦自己要設(shè)計(jì)、開(kāi)發(fā)和調(diào)試模板庫(kù),就會(huì)立即遭遇泛型編程的首要難題:?jiǎn)栴}的判斷、解決都很困難。作者本人就有過(guò)由于實(shí)在難于調(diào)試,因此先改回一般函數(shù),調(diào)試完成后再轉(zhuǎn)成模板方式的經(jīng)歷。例如我們另外設(shè)計(jì)一個(gè)復(fù)數(shù)類:

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

同樣對(duì)它調(diào)用add函數(shù):

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

編譯之后,開(kāi)發(fā)環(huán)境顯示如下:

如何理解C++20中的Concepts

信息的內(nèi)容主要有:

出錯(cuò)的位置是代碼第22行。由于這個(gè)模板函數(shù)已經(jīng)可以用于整數(shù)和雙精度數(shù),錯(cuò)誤的原因不在模板函數(shù)本身,而是在調(diào)用模板時(shí)使用實(shí)際數(shù)據(jù)Complex。但問(wèn)題是錯(cuò)誤信息并沒(méi)有提示是哪個(gè)調(diào)用出的問(wèn)題。

另外,錯(cuò)誤信息顯示沒(méi)有匹配的+操作符,這是真正的原因。但是接下來(lái)Complex沒(méi)有從各種類繼承等附注信息就只有添亂了。作者相信只要使用過(guò)泛型編程的程序員都會(huì)有過(guò)類似的經(jīng)歷。

對(duì)策很簡(jiǎn)單,重載一個(gè)針對(duì)Complex的+運(yùn)算符就行了。

C++20新特性之Concept

很快就會(huì)正式發(fā)布的C++20引入了一個(gè)新特性-Concept。簡(jiǎn)單講就是描述模板參數(shù)的特性和要求。例如對(duì)于add模板函數(shù)來(lái)講,我們要求模板參數(shù)是可以執(zhí)行加法運(yùn)算的,這是可以定義下面的Concept:

templateconcept Addable = requires (T obj) {{obj + obj}->std::same_as;};

concept Addable聲明名為Addable的概念。

requires用來(lái)描述各種需求,它的參數(shù)有點(diǎn)像函數(shù)的參數(shù)定義,參數(shù)的類型可以是模板參數(shù)(例如T),也可以是已經(jīng)定義的其他類型。參數(shù)名obj的作用類似變量,會(huì)在需求描述中使用。

{obj+obj}描述加法運(yùn)算,它的涵義是T類型的對(duì)象obj需要支持加法運(yùn)算,而花括號(hào)后面的->所指的是花括號(hào)中的運(yùn)算結(jié)果應(yīng)該滿足的條件,這里使用了標(biāo)準(zhǔn)庫(kù)中的same_as約束,要求結(jié)果類型和T是一樣的。

簡(jiǎn)單說(shuō)來(lái),就是T類型應(yīng)該支持加法運(yùn)算,而且結(jié)果類型還是T。

定義Concept之后,模板函數(shù)這樣寫(xiě):

templateT add(T in1, T in2){    return in1 + in2;}

唯一的變化就是將typename T改成了Addable T,表明這個(gè)T是要符合Addable概念的。引入的Concept之后,同樣的問(wèn)題,顯示的錯(cuò)誤信息完全不同:

如何理解C++20中的Concepts

出錯(cuò)的位置從模板函數(shù)內(nèi)部變成了調(diào)用模板函數(shù)的代碼(58行)。軟件規(guī)模變大之后,快速定位引發(fā)問(wèn)題的位置特別重要。

錯(cuò)誤提示也很清晰,都是說(shuō)沒(méi)有滿足特定的約束條件。沒(méi)有任何干擾信息。

以上就是如何理解C++20中的Concepts,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁(yè)題目:如何理解C++20中的Concepts
文章網(wǎng)址:http://weahome.cn/article/ghjhhj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部