国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

掌握C++20的革命性特性:Concepts

這篇具有很好參考價(jià)值的文章主要介紹了掌握C++20的革命性特性:Concepts。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

掌握C++20的革命性特性:Concepts

C++20 的新特性

C++20 引入了 Concepts,這是一種用于限制類和函數(shù)模板的模板類型和非類型參數(shù)的命名要求。Concepts 是作為編譯時(shí)評估的謂詞,用于驗(yàn)證傳遞給模板的模板參數(shù)。Concepts 的主要目的是使模板相關(guān)的編譯器錯(cuò)誤更易于人類閱讀。

我們都遇到過這樣的情況:當(dāng)為類或函數(shù)模板提供錯(cuò)誤的參數(shù)時(shí),編譯器會(huì)輸出數(shù)百行錯(cuò)誤信息。要從這些編譯器錯(cuò)誤中找到根本原因并不總是容易的。Concepts 允許編譯器在某些類型約束不滿足時(shí)輸出更易讀的錯(cuò)誤消息。因此,為了獲得有意義的語義錯(cuò)誤,建議編寫模擬語義要求的 Concepts。避免僅針對語法方面而沒有任何語義意義的 Concepts 驗(yàn)證,例如,僅檢查類型是否支持 operator+ 的 Concept。這樣的 Concept 只會(huì)檢查語法,而不是語義。例如 std::string 支持 operator+,但顯然,它與整數(shù)的 operator+ 有完全不同的含義。另一方面,如 sortable(可排序)和 swappable(可交換)等 Concepts 是模擬一些語義意義的好例子。

注意:編寫 Concepts 時(shí),請確保它們模擬語義,而不僅僅是語法。

Concepts 的語法

定義 Concepts 的通用語法如下:

template <parameter-list> concept concept-name = constraints-expression;

它以熟悉的 template<> 規(guī)范開始,但與類和函數(shù)模板不同,Concepts 永遠(yuǎn)不會(huì)被實(shí)例化。接下來,使用一個(gè)新關(guān)鍵字 concept,后跟 Concept 的名稱。你可以使用任何你想要的名稱。constraints-expression 可以是任何常量表達(dá)式,即任何可以在編譯時(shí)評估的表達(dá)式。約束表達(dá)式必須產(chǎn)生布爾值。約束永遠(yuǎn)不會(huì)在運(yùn)行時(shí)評估。約束表達(dá)式將在下一節(jié)中詳細(xì)討論。

Concept 表達(dá)式的語法如下:

concept-name<argument-list>

Concept 表達(dá)式評估為真或假。如果評估為真,則稱給定的模板參數(shù)模擬了該 Concept。

Constraints Expression

常量表達(dá)式

可直接用作 Concept 定義約束的布爾常量表達(dá)式必須精確地計(jì)算為布爾值,不進(jìn)行任何類型轉(zhuǎn)換。例如:

template <typename T>
concept C = sizeof(T) == 4;

Requires 表達(dá)式

Requires 表達(dá)式的語法如下:

requires (parameter-list) { requirements; }

參數(shù)列表是可選的。每個(gè)要求必須以分號結(jié)束。有四種類型的要求:簡單要求、類型要求、復(fù)合要求和嵌套要求。

簡單要求

簡單要求是任意不以 requires 開頭的表達(dá)式語句。例如,以下 Concept 定義規(guī)定了某種類型 T 必須支持后綴和前綴 ++ 操作符:

template <typename T>
concept Incrementable = requires(T x) {
    x++;
    ++x;
};
類型要求

類型要求驗(yàn)證某種類型是否有效。例如,以下 Concept 要求某種類型 T 具有 value_type 成員:

template <typename T>
concept C = requires {
    typename T::value_type;
};
復(fù)合要求

復(fù)合要求用于驗(yàn)證某事物不拋出異常,以及/或驗(yàn)證某個(gè)方法返回特定類型。例如,以下 Concept 驗(yàn)證給定類型具有標(biāo)記為 noexcept 的 swap() 方法:

template <typename T>
concept C = requires (T x, T y) {
    { x.swap(y) } noexcept;
};
嵌套要求

Requires 表達(dá)式可以包含嵌套要求。例如,這里是一個(gè)要求類型大小為 4 字節(jié)并支持前綴和后綴增量和減量操作的 Concept:

template <typename T>
concept C = requires (T t) {
    requires sizeof(t) == 4;
    ++t;
    --t;
    t++;
    t--;
};

Requires 表達(dá)式可以有多個(gè)參數(shù),并且可以由一系列要求組成。例如,以下 Concept 要求類型 T 的實(shí)例是可比較的:

template <typename T>
concept Comparable = requires(const T a, const T b) {
    { a == b } -> convertible_to<bool>;
    { a < b } -> convertible_to<bool>;
    // ... 對其他比較操作符的類似要求 ...
};

組合 Concept 表達(dá)式

使用邏輯運(yùn)算符組合

現(xiàn)有的 Concept 表達(dá)式可以通過使用邏輯運(yùn)算符“與”(&&)和“或”(||)來組合。例如,假設(shè)您有一個(gè)類似于 Incrementable 的 Decrementable Concept;以下示例展示了一個(gè)要求類型同時(shí)具備增量和減量能力的 Concept:

template <typename T>
concept IncrementableAndDecrementable = Incrementable<T> && Decrementable<T>;

預(yù)定義的標(biāo)準(zhǔn) Concepts

標(biāo)準(zhǔn)庫中的 Concepts

標(biāo)準(zhǔn)庫定義了一系列預(yù)定義的 Concepts,分為多個(gè)類別。以下列表給出了每個(gè)類別中的一些示例 Concepts,所有這些都在 <concepts> 頭文件和 std 命名空間中定義:

  • 核心語言 Conceptssame_as、derived_fromconvertible_to、integralfloating_point、copy_constructible 等。
  • 比較 Conceptsequality_comparable、totally_ordered 等。
  • 對象 Conceptsmovablecopyable 等。
  • 可調(diào)用 Conceptsinvocable、predicate 等。

此外,<iterator> 頭文件定義了與迭代器相關(guān)的 Concepts,如 random_access_iterator、forward_iterator 等,還定義了算法要求,如 mergeablesortable、permutable 等。

C++20 范圍庫還提供了一些標(biāo)準(zhǔn) Concepts。第17章《理解迭代器和范圍庫》詳細(xì)討論了迭代器和范圍,而第20章更深入地探討了標(biāo)準(zhǔn)庫提供的算法。

使用標(biāo)準(zhǔn) Concepts

如果這些標(biāo)準(zhǔn) Concepts 滿足您的需求,您可以直接使用它們,無需自己實(shí)現(xiàn)。例如,以下 Concept 要求類型 T 是從類 Foo 派生的:

template <typename T>
concept IsDerivedFromFoo = derived_from<T, Foo>;

以下 Concept 要求類型 T 可以轉(zhuǎn)換為 bool

template <typename T>
concept IsConvertibleToBool = convertible_to<T, bool>;

這些標(biāo)準(zhǔn) Concepts 也可以組合成更具體的 Concepts。例如,以下 Concept 要求類型 T 既是默認(rèn)構(gòu)造的也是可拷貝構(gòu)造的:

template <typename T>
concept DefaultAndCopyConstructible = default_initializable<T> && copy_constructible<T>;

注意:編寫完整且正確的 Concepts 并不總是容易的。如果可能,嘗試使用現(xiàn)有的標(biāo)準(zhǔn) Concepts 或它們的組合來約束您的類型。文章來源地址http://www.zghlxwxcb.cn/news/detail-807761.html

到了這里,關(guān)于掌握C++20的革命性特性:Concepts的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ChatGPT-4 Alpha:OpenAI的革命性升級

    近日,OpenAI公司發(fā)布了備受矚目的GPT-4 Alpha版本,這是一次革命性的升級。以下將為您詳細(xì)介紹這一重大突破,并解釋為何它引起了廣泛關(guān)注。 GPT-4 Alpha是OpenAI公司最新推出的人工智能語言模型,它基于GPT-4.0架構(gòu)開發(fā),擁有更強(qiáng)大的處理能力和更出色的表現(xiàn)。該模型經(jīng)過大規(guī)

    2024年02月20日
    瀏覽(15)
  • DDC技術(shù):AIGC網(wǎng)絡(luò)的革命性解決方案

    DDC技術(shù):AIGC網(wǎng)絡(luò)的革命性解決方案

    2023年,人工智能生成內(nèi)容(AIGC)技術(shù)將蓬勃發(fā)展,其中ChatGPT作為一個(gè)典型案例,在文本生成、代碼開發(fā)和詩歌創(chuàng)作等多個(gè)領(lǐng)域引起行業(yè)變革。DDC技術(shù)對改變網(wǎng)絡(luò)格局具有創(chuàng)新和突破性意義,很大程度上提升了效率和連接性。本文將介紹這一AIGC網(wǎng)絡(luò)的新一代革命性解決方案—

    2024年02月19日
    瀏覽(17)
  • 加速軟件開發(fā)和交付的革命性方法-DevOps

    加速軟件開發(fā)和交付的革命性方法-DevOps

    “ 隨著信息技術(shù)的快速發(fā)展,現(xiàn)代軟件開發(fā)和交付已經(jīng)經(jīng)歷了巨大的變革。DevOps(Development和Operations的結(jié)合)已經(jīng)成為這一變革的關(guān)鍵推動(dòng)力,讓開發(fā)團(tuán)隊(duì)和運(yùn)維團(tuán)隊(duì)之間的界限變得模糊,以加速軟件的開發(fā)、測試和部署過程。本文將介紹DevOps的核心概念、原則和優(yōu)勢,以及

    2024年02月06日
    瀏覽(21)
  • Transformer模型簡介:一種革命性的深度學(xué)習(xí)模型

    Transformer模型是一種革命性的深度學(xué)習(xí)模型,最初用于自然語言處理任務(wù),如機(jī)器翻譯和語言建模。與傳統(tǒng)的序列模型相比,如循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)和卷積神經(jīng)網(wǎng)絡(luò)(CNN),Transformer模型采用一種全新的方式來處理序列數(shù)據(jù),即通過注意力機(jī)制來學(xué)習(xí)序列中的關(guān)系。 在傳統(tǒng)的序列模

    2024年02月15日
    瀏覽(54)
  • 機(jī)器學(xué)習(xí)與人工智能:一場革命性的變革

    機(jī)器學(xué)習(xí)與人工智能:一場革命性的變革

    1956年8月,在美國漢諾斯小鎮(zhèn)寧靜的達(dá)特茅斯學(xué)院中,約翰·麥卡錫(John McCarthy)、馬文·閔斯基(MarvinMinsky,人工智能與認(rèn)知學(xué)專家)、克勞德·香農(nóng)(Claude Shannon,信息論的創(chuàng)始人)、艾倫·紐厄爾(AllenNewell,計(jì)算機(jī)科學(xué)家)、赫伯特·西蒙(Herbert Simon,諾貝爾經(jīng)濟(jì)學(xué)獎(jiǎng)得

    2024年02月04日
    瀏覽(24)
  • 【Docker】聯(lián)合探討Docker:容器化技術(shù)的革命性應(yīng)用

    【Docker】聯(lián)合探討Docker:容器化技術(shù)的革命性應(yīng)用

    前言 Docker 是一個(gè) 開源的應(yīng)用容器引擎 ,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的 Linux或Windows 操作系統(tǒng)的機(jī)器上,也可以實(shí)現(xiàn)虛擬化,容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。 ??作者簡介: 熱愛跑步的恒川 ,致力于

    2024年02月08日
    瀏覽(24)
  • 無人機(jī)巡檢技術(shù)革命性變革光伏電站運(yùn)維管理

    無人機(jī)巡檢技術(shù)革命性變革光伏電站運(yùn)維管理

    在中國廣袤的大地上,光伏電站如雨后春筍般崛起,晶體硅組件板在陽光下熠熠生輝,為人們帶來了源源不斷的綠色能源。然而,隨著光伏產(chǎn)業(yè)的迅猛發(fā)展,電站運(yùn)維管理面臨著前所未有的挑戰(zhàn)。而無人機(jī)巡檢技術(shù)的引入,為光伏電站的運(yùn)維管理帶來了革命性的變革。 相比傳

    2024年04月14日
    瀏覽(27)
  • GPT-3.5:ChatGPT的奇妙之處和革命性進(jìn)步

    GPT-3.5:ChatGPT的奇妙之處和革命性進(jìn)步

    ???? 博主 libin9iOak帶您 Go to New World.??? ?? 個(gè)人主頁——libin9iOak的博客?? ?? 《面試題大全》 文章圖文并茂??生動(dòng)形象??簡單易學(xué)!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍》學(xué)會(huì)IDEA常用操作,工作效率翻倍~?? ???? 希望本文能夠給您帶來一定的幫助??文章粗淺,敬

    2024年02月15日
    瀏覽(19)
  • 視頻生成可以無限長?谷歌VideoPoet大模型上線,網(wǎng)友:革命性技術(shù)

    視頻生成可以無限長?谷歌VideoPoet大模型上線,網(wǎng)友:革命性技術(shù)

    蒙娜麗莎打哈欠,小雞學(xué)會(huì)舉鐵……谷歌VideoPoet大模型表現(xiàn)很亮眼。 2023 年底,科技公司都在沖擊生成式 AI 的最后一個(gè)關(guān)卡 —— 視頻生成。 本周二,谷歌提出的視頻生成大模型上線,立刻獲得了人們的關(guān)注。這款名為 VideoPoet 的大語言模型,被人們認(rèn)為是革命性的 zero-sho

    2024年02月02日
    瀏覽(17)
  • 如何將區(qū)塊鏈與大數(shù)據(jù)結(jié)合,為行業(yè)帶來革命性變革

    區(qū)塊鏈技術(shù)和大數(shù)據(jù)技術(shù)都是21世紀(jì)的熱門話題之一,它們各自具有獨(dú)特的優(yōu)勢,如果將它們結(jié)合起來,將會(huì)為各行業(yè)帶來革命性變革。區(qū)塊鏈技術(shù)可以提供一個(gè)安全、透明、去中心化的數(shù)據(jù)共享平臺,而大數(shù)據(jù)技術(shù)則可以提供海量、多樣化的數(shù)據(jù)源,這兩者的結(jié)合將有望解

    2024年04月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包