亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

模板約束concepts是什么 C++20新特性實(shí)踐指南

P粉602998670
發(fā)布: 2025-08-18 08:55:01
原創(chuàng)
491人瀏覽過(guò)
C++20的Concepts通過(guò)在編譯時(shí)明確模板參數(shù)的約束條件,使泛型代碼的錯(cuò)誤信息更清晰、意圖更明確,提升了代碼的健壯性、可讀性和可維護(hù)性。

模板約束concepts是什么 c++20新特性實(shí)踐指南

C++20的模板約束,也就是Concepts,本質(zhì)上就是給你的模板參數(shù)加了一層“門(mén)檻”或“合同”。它允許你在編譯時(shí)就明確地聲明一個(gè)模板參數(shù)需要滿(mǎn)足哪些條件,比如它必須支持哪些操作、具有哪些類(lèi)型特征。這徹底改變了我們編寫(xiě)和理解泛型代碼的方式,讓模板錯(cuò)誤變得前所未有的清晰,也讓代碼意圖一目了然。

解決方案

說(shuō)實(shí)話(huà),寫(xiě)C++模板,尤其是在C++20之前,有時(shí)候真像是在玩一場(chǎng)“盲盒”游戲。你定義了一個(gè)

template<typename T>
登錄后復(fù)制
,然后就指望
T
登錄后復(fù)制
能支持你后面用到的所有操作,比如
T + T
登錄后復(fù)制
,或者
T.size()
登錄后復(fù)制
。一旦
T
登錄后復(fù)制
不支持,那編譯器給你的錯(cuò)誤信息往往是一大堆SFINAE(Substitution Failure Is Not An Error)導(dǎo)致的、長(zhǎng)得嚇人的模板實(shí)例化失敗報(bào)告,讓你頭大。它不會(huì)告訴你“你傳入的類(lèi)型
int
登錄后復(fù)制
沒(méi)有
size()
登錄后復(fù)制
方法”,而是告訴你
std::vector<int>::size()
登錄后復(fù)制
的某個(gè)重載匹配失敗了,或者某個(gè)
operator+
登錄后復(fù)制
找不到。這簡(jiǎn)直是災(zāi)難。

Concepts的出現(xiàn),就是為了解決這個(gè)痛點(diǎn)。它提供了一種聲明式的語(yǔ)法,讓你能夠直接在模板參數(shù)上寫(xiě)明“我這個(gè)模板需要一個(gè)能加能減的類(lèi)型”,或者“我需要一個(gè)像容器一樣,能迭代、有

size()
登錄后復(fù)制
方法的類(lèi)型”。

它的核心思想是:提前檢查,明確意圖。

立即學(xué)習(xí)C++免費(fèi)學(xué)習(xí)筆記(深入)”;

你定義一個(gè)

concept
登錄后復(fù)制
,它本質(zhì)上是一個(gè)編譯期謂詞,用來(lái)描述一組類(lèi)型需求。比如:

template<typename T>
concept Addable = requires(T a, T b) {
    a + b; // 要求 T 類(lèi)型的對(duì)象可以相加
};

template<Addable T>
T add_values(T a, T b) {
    return a + b;
}

// 現(xiàn)在,如果你嘗試:
// add_values(1, 2); // OK,int 是 Addable 的
// add_values("hello", "world"); // 編譯錯(cuò)誤,std::string 的 operator+ 返回 std::string,但這里我們只檢查了 a+b 是否可調(diào)用
// 更精確的 Addable 應(yīng)該檢查返回類(lèi)型:
template<typename T>
concept BetterAddable = requires(T a, T b) {
    { a + b } -> std::same_as<T>; // 要求 a+b 的結(jié)果類(lèi)型是 T
};
template<BetterAddable T>
T better_add_values(T a, T b) {
    return a + b;
}
// better_add_values("hello", "world"); // 編譯錯(cuò)誤,std::string 的 operator+ 返回 std::string,但我們要求結(jié)果類(lèi)型是 T,這里 T 是 std::string,所以是 OK 的。
// 這里的 BetterAddable 還需要考慮隱式轉(zhuǎn)換或更通用的返回類(lèi)型。
// 實(shí)際上,std::string 的 operator+ 返回 std::string,所以它滿(mǎn)足 BetterAddable。
// 錯(cuò)誤示例:
struct MyStruct {};
// better_add_values(MyStruct{}, MyStruct{}); // 編譯錯(cuò)誤,MyStruct 不支持 operator+
登錄后復(fù)制

當(dāng)你在

template<Addable T>
登錄后復(fù)制
這樣使用時(shí),編譯器會(huì)在實(shí)例化模板之前,就檢查你傳入的
T
登錄后復(fù)制
是否滿(mǎn)足
Addable
登錄后復(fù)制
這個(gè)概念。如果不滿(mǎn)足,它會(huì)給出清晰的錯(cuò)誤信息,告訴你“類(lèi)型
X
登錄后復(fù)制
不滿(mǎn)足
Addable
登錄后復(fù)制
概念,因?yàn)樗恢С旨臃ú僮鳌薄_@比以前那些晦澀的錯(cuò)誤信息簡(jiǎn)直是天壤之別。

Concepts不僅僅是語(yǔ)法糖,它改變了模板的“契約”模型。以前是“鴨子類(lèi)型”(如果它走起來(lái)像鴨子,叫起來(lái)像鴨子,那它就是鴨子),現(xiàn)在是“顯式契約”(它必須明確聲明自己是鴨子,并滿(mǎn)足鴨子的所有特征)。

為什么C++20模板約束(Concepts)能讓你的代碼更健壯?

這問(wèn)題問(wèn)得好,健壯性,其實(shí)就是代碼的抗壓能力和可預(yù)測(cè)性。Concepts在這方面,真的是質(zhì)的飛躍。

你想想看,以前我們寫(xiě)一個(gè)泛型算法,比如一個(gè)

sort
登錄后復(fù)制
函數(shù),它需要一個(gè)能比較大小的類(lèi)型。我們可能就會(huì)寫(xiě)
template<typename T>
登錄后復(fù)制
,然后期望
T
登錄后復(fù)制
支持
operator<
登錄后復(fù)制
。如果用戶(hù)傳了一個(gè)沒(méi)有
operator<
登錄后復(fù)制
的自定義類(lèi)型,或者一個(gè)
operator<
登錄后復(fù)制
行為不符合預(yù)期的類(lèi)型,編譯錯(cuò)誤就來(lái)了,而且常常很難定位。更糟糕的是,如果
T
登錄后復(fù)制
恰好有
operator<
登錄后復(fù)制
,但這個(gè)操作不是你想要的(比如一個(gè)
Point
登錄后復(fù)制
類(lèi)型,
operator<
登錄后復(fù)制
是比較X坐標(biāo),但你期望的是按距離原點(diǎn)排序),那代碼就默默地跑錯(cuò)了,這比編譯錯(cuò)誤更可怕。

Concepts是怎么解決的呢?

  1. 編譯期明確的錯(cuò)誤信息: 這是最直觀的優(yōu)勢(shì)。當(dāng)一個(gè)類(lèi)型不滿(mǎn)足概念時(shí),編譯器會(huì)直接告訴你:“抱歉,

    MyCustomType
    登錄后復(fù)制
    不符合
    Sortable
    登錄后復(fù)制
    概念,因?yàn)樗鄙?div id="wjcelcm34c" class="code" style="position:relative; padding:0px; margin:0px;">
    operator<
    登錄后復(fù)制
或者它的
operator<
登錄后復(fù)制
不滿(mǎn)足要求?!边@種錯(cuò)誤信息,對(duì)于開(kāi)發(fā)者來(lái)說(shuō),簡(jiǎn)直是福音,排查問(wèn)題的時(shí)間大大縮短。

  • 設(shè)計(jì)意圖的清晰表達(dá): Concepts讓模板的“接口”變得透明。當(dāng)你看到

    template<Sortable T>
    登錄后復(fù)制
    時(shí),你立刻就知道這個(gè)模板期望
    T
    登錄后復(fù)制
    是一個(gè)可排序的類(lèi)型。這種“設(shè)計(jì)即文檔”的特性,讓代碼的自解釋性變得極強(qiáng)。維護(hù)者和新加入的團(tuán)隊(duì)成員不需要去猜測(cè)模板內(nèi)部對(duì)
    T
    登錄后復(fù)制
    有什么隱含要求,直接看Concepts就知道。

  • 強(qiáng)制性的契約: Concepts為模板參數(shù)定義了一個(gè)強(qiáng)制性的“契約”。類(lèi)型必須滿(mǎn)足這個(gè)契約才能被用作模板參數(shù)。這就像你簽合同一樣,條款清清楚楚,不能蒙混過(guò)關(guān)。這種強(qiáng)制性,避免了許多運(yùn)行時(shí)錯(cuò)誤和邏輯錯(cuò)誤,因?yàn)椴环掀跫s的類(lèi)型根本無(wú)法通過(guò)編譯。

  • 更好的重載解析: 有時(shí)候,你可能想為不同的類(lèi)型提供不同的模板實(shí)現(xiàn)。比如,一個(gè)

    print
    登錄后復(fù)制
    函數(shù),對(duì)普通類(lèi)型直接打印,對(duì)容器類(lèi)型則遍歷打印。以前你可能需要SFINAE或者模板特化來(lái)搞定,代碼會(huì)變得很復(fù)雜。有了Concepts,你可以直接定義:

    template<Printable T>
    void print(const T& value) { /* ... */ }
    
    template<Container C> // 假設(shè) Container 是一個(gè)概念,表示可迭代的容器
    void print(const C& container) { /* ... */ }
    登錄后復(fù)制

    編譯器會(huì)根據(jù)傳入的類(lèi)型是否滿(mǎn)足

    Printable
    登錄后復(fù)制
    Container
    登錄后復(fù)制
    概念,自動(dòng)選擇最匹配的
    print
    登錄后復(fù)制
    版本。這讓泛型代碼的重載和特化邏輯變得異常清晰和簡(jiǎn)潔。

  • 所以,從根本上講,Concepts通過(guò)將類(lèi)型約束從隱式的、運(yùn)行時(shí)推導(dǎo)的,轉(zhuǎn)變?yōu)轱@式的、編譯期強(qiáng)制的,極大地提升了泛型代碼的健壯性、可讀性和可維護(hù)性。它讓我們的模板不再是“黑盒”,而是帶有明確說(shuō)明書(shū)的“工具箱”。

    C++20 Concepts 的核心語(yǔ)法與常見(jiàn)用法有哪些?

    既然知道了Concepts的好處,那我們來(lái)聊聊它的一些核心語(yǔ)法和實(shí)際怎么用。這玩意兒,上手其實(shí)不難,但要用得精妙,還是需要一些實(shí)踐。

    最基礎(chǔ)的,就是

    concept
    登錄后復(fù)制
    關(guān)鍵字和
    requires
    登錄后復(fù)制
    表達(dá)式。

    1.
    concept
    登錄后復(fù)制
    定義

    template<typename T>
    concept MyConcept = requires(T var) {
        // 這里的語(yǔ)句是要求 T 必須支持的操作
        // 它不是真的執(zhí)行這些操作,只是檢查它們是否是合法的表達(dá)式
        var.foo(); // 要求 T 必須有成員函數(shù) foo()
        { var + 1 } -> std::same_as<int>; // 要求 var + 1 是一個(gè)合法的表達(dá)式,并且結(jié)果類(lèi)型是 int
        typename T::value_type; // 要求 T 必須有嵌套類(lèi)型 value_type
        requires sizeof(T) > 4; // 嵌套 requires 表達(dá)式,要求 T 的大小大于 4
    };
    登錄后復(fù)制

    requires
    登錄后復(fù)制
    表達(dá)式內(nèi)部可以包含多種“要求”:

    AiPPT模板廣場(chǎng)
    AiPPT模板廣場(chǎng)

    AiPPT模板廣場(chǎng)-PPT模板-word文檔模板-excel表格模板

    AiPPT模板廣場(chǎng)50
    查看詳情 AiPPT模板廣場(chǎng)
    • 簡(jiǎn)單要求 (Simple requirements):
      expression;
      登錄后復(fù)制
      檢查表達(dá)式是否合法,不關(guān)心返回值。
    • 類(lèi)型要求 (Type requirements):
      typename TypeName;
      登錄后復(fù)制
      檢查是否存在某個(gè)嵌套類(lèi)型。
    • 復(fù)合要求 (Compound requirements):
      { expression } -> ReturnType;
      登錄后復(fù)制
      檢查表達(dá)式是否合法,并要求其返回類(lèi)型與
      ReturnType
      登錄后復(fù)制
      兼容(可以隱式轉(zhuǎn)換)。
    • noexcept 要求 (Noexcept requirements):
      { expression } noexcept;
      登錄后復(fù)制
      檢查表達(dá)式是否合法,并要求其是
      noexcept
      登錄后復(fù)制
      的。
    • 嵌套要求 (Nested requirements):
      requires nested_concept<T>;
      登錄后復(fù)制
      或者
      requires another_expression;
      登錄后復(fù)制
      允許在
      requires
      登錄后復(fù)制
      表達(dá)式內(nèi)部再使用
      requires
      登錄后復(fù)制
      表達(dá)式,或者引用其他概念。

    2. Concepts 的使用方式

    定義好

    concept
    登錄后復(fù)制
    后,就可以在模板參數(shù)列表里直接使用了,有幾種常見(jiàn)形式:

    • 直接作為類(lèi)型約束:
      template<Printable T> // 要求 T 滿(mǎn)足 Printable 概念
      void print_value(const T& val) {
          // ...
      }
      登錄后復(fù)制
    • requires
      登錄后復(fù)制
      子句:
      當(dāng)概念比較復(fù)雜,或者你想給一個(gè)函數(shù)模板添加約束,但又不想專(zhuān)門(mén)定義一個(gè)
      concept
      登錄后復(fù)制
      時(shí):
      template<typename T>
      void process(T val) requires (std::is_integral_v<T> && sizeof(T) > 4) {
          // 只有 T 是整型且大小大于4字節(jié)時(shí)才能調(diào)用
      }
      登錄后復(fù)制

      或者結(jié)合

      requires
      登錄后復(fù)制
      表達(dá)式:

      template<typename T>
      void process_complex(T val) requires requires(T x) { x.method(); { x + 1 } -> std::same_as<int>; } {
          // 這種方式直接在 requires 子句里寫(xiě)了表達(dá)式
      }
      登錄后復(fù)制
    • 簡(jiǎn)寫(xiě)模板語(yǔ)法 (Abbreviated Function Templates): 這是C++20的一個(gè)甜點(diǎn),當(dāng)你只用一個(gè)概念約束一個(gè)類(lèi)型時(shí),可以省略
      template<typename T>
      登錄后復(fù)制
      // 替代 template<Printable T> void print_value(const T& val)
      void print_value(Printable auto& val) {
          // ...
      }
      登錄后復(fù)制

      這里的

      Printable auto
      登錄后復(fù)制
      就表示
      auto
      登錄后復(fù)制
      推導(dǎo)出的類(lèi)型必須滿(mǎn)足
      Printable
      登錄后復(fù)制
      概念。

    3. 常見(jiàn)用法示例

    • 可比較類(lèi)型:

      template<typename T>
      concept EqualityComparable = requires(T a, T b) {
          { a == b } -> std::convertible_to<bool>;
          { a != b } -> std::convertible_to<bool>;
      };
      
      template<EqualityComparable T>
      bool are_equal(const T& a, const T& b) {
          return a == b;
      }
      登錄后復(fù)制
    • 可調(diào)用對(duì)象:

      template<typename F, typename... Args>
      concept Invocable = requires(F f, Args... args) {
          std::invoke(f, args...); // 要求 F 可以被 Args 調(diào)用
      };
      
      template<Invocable<int, int> Func> // 要求 Func 可以被兩個(gè) int 調(diào)用
      int apply_func(Func f, int a, int b) {
          return f(a, b);
      }
      登錄后復(fù)制
    • 容器概念 (Ranges 庫(kù)中的 Concepts): C++20的Ranges庫(kù)大量使用了Concepts,比如

      std::ranges::range
      登錄后復(fù)制
      std::ranges::input_range
      登錄后復(fù)制
      等。

      #include <ranges>
      #include <vector>
      #include <iostream>
      
      template<std::ranges::input_range R> // 要求 R 是一個(gè)輸入范圍
      void print_elements(const R& r) {
          for (const auto& elem : r) {
              std::cout << elem << " ";
          }
          std::cout << std::endl;
      }
      
      // print_elements(std::vector<int>{1, 2, 3}); // OK
      // print_elements(5); // 編譯錯(cuò)誤,int 不是一個(gè) range
      登錄后復(fù)制

    這些例子展示了Concepts如何讓我們的泛型代碼變得更具表達(dá)力、更安全。它不只是一個(gè)語(yǔ)法糖,更是一種思維模式的轉(zhuǎn)變,讓我們?cè)谠O(shè)計(jì)模板時(shí)就能考慮到類(lèi)型可能遇到的所有“邊界條件”。

    如何利用 C++20 Concepts 編寫(xiě)更易于維護(hù)和擴(kuò)展的泛型代碼?

    這其實(shí)是Concepts最深層次的價(jià)值體現(xiàn)。它不僅僅是讓錯(cuò)誤信息好看,更是對(duì)泛型編程范式的一次重塑,讓代碼庫(kù)能更好地“呼吸”和“成長(zhǎng)”。

    1. 明確的接口,降低維護(hù)成本

    我們都知道,好的接口設(shè)計(jì)是降低維護(hù)成本的關(guān)鍵。在Concepts出現(xiàn)之前,模板的接口是隱式的,你得通過(guò)閱讀模板的實(shí)現(xiàn)代碼,甚至通過(guò)看它引發(fā)的編譯錯(cuò)誤,才能反推出它對(duì)類(lèi)型有什么要求。這簡(jiǎn)直是維護(hù)人員的噩夢(mèng)。

    有了Concepts,模板的“契約”變得顯式化。當(dāng)你看到一個(gè)

    template<Sortable T>
    登錄后復(fù)制
    的函數(shù)時(shí),你不需要翻閱函數(shù)內(nèi)部的代碼,就能立刻知道
    T
    登錄后復(fù)制
    必須是可排序的。這種“設(shè)計(jì)即文檔”的特性,大大減少了新成員學(xué)習(xí)代碼庫(kù)的時(shí)間,也降低了老成員回憶某個(gè)模板具體要求的認(rèn)知負(fù)擔(dān)。

    例如,如果你要擴(kuò)展一個(gè)舊的排序算法,使其支持新的數(shù)據(jù)結(jié)構(gòu)。在沒(méi)有Concepts時(shí),你可能需要嘗試編譯,然后根據(jù)冗長(zhǎng)的錯(cuò)誤信息去猜測(cè)新數(shù)據(jù)結(jié)構(gòu)缺少了什么。有了Concepts,你只需要查看排序算法所依賴(lài)的Concepts定義,就能清晰地知道新數(shù)據(jù)結(jié)構(gòu)需要實(shí)現(xiàn)哪些操作才能滿(mǎn)足要求。

    2. 更好的模塊化和組合性

    Concepts本身就是模塊化的。你可以定義一些基礎(chǔ)的Concepts,比如

    EqualityComparable
    登錄后復(fù)制
    、
    Addable
    登錄后復(fù)制
    Callable
    登錄后復(fù)制
    ,然后將它們組合成更復(fù)雜的Concepts。

    template<typename T>
    concept Numeric = std::is_arithmetic_v<T>; // 基礎(chǔ)概念:是算術(shù)類(lèi)型
    
    template<typename T>
    concept Ordered = requires(T a, T b) {
        { a < b } -> std::convertible_to<bool>;
        { a > b } -> std::convertible_to<bool>;
    }; // 基礎(chǔ)概念:可排序
    
    template<typename T>
    concept SortableNumeric = Numeric<T> && Ordered<T>; // 組合概念:既是數(shù)字又可排序
    
    template<SortableNumeric T>
    void sort_data(std::vector<T>& data) {
        std::sort(data.begin(), data.end());
    }
    登錄后復(fù)制

    這種組合性讓Concepts的定義變得非常靈活和可復(fù)用。當(dāng)你需要一個(gè)新的復(fù)雜概念時(shí),你不需要從頭開(kāi)始寫(xiě)一大堆

    requires
    登錄后復(fù)制
    表達(dá)式,而是可以像搭積木一樣,把已有的、經(jīng)過(guò)驗(yàn)證的基礎(chǔ)Concepts組合起來(lái)。這不僅提高了代碼復(fù)用率,也保證了概念定義的一致性。

    3. 精確的約束重載,提升代碼適應(yīng)性

    在泛型編程中,我們經(jīng)常會(huì)遇到這樣的場(chǎng)景:對(duì)于某些特定類(lèi)型的參數(shù),我們希望提供一個(gè)優(yōu)化過(guò)的、或者行為略有不同的實(shí)現(xiàn)。以前,這通常通過(guò)模板特化或者SFINAE(Substitution Failure Is Not An Error)來(lái)實(shí)現(xiàn)。SFINAE雖然強(qiáng)大,但語(yǔ)法復(fù)雜且難以閱讀,容易出錯(cuò)。

    Concepts提供了更優(yōu)雅的解決方案——約束重載。你可以定義多個(gè)函數(shù)模板,它們的名字相同,但它們的Concepts約束不同。編譯器會(huì)根據(jù)傳入的類(lèi)型,選擇最符合約束的那個(gè)版本。

    // 通用打印函數(shù)
    template<typename T>
    concept Printable = requires(std::ostream& os, const T& val) {
        os << val;
    };
    
    template<Printable T>
    void print_item(const T& item) {
        std::cout << "Generic print: " << item << std::endl;
    }
    
    // 針對(duì)容器的特殊打印函數(shù)
    template<typename T>
    concept Container = requires(T c) {
        c.begin();
        c.end();
        c.empty();
        // 還可以加上更多要求,比如 value_type
    };
    
    template<Container C>
    void print_item(const C& container) {
        std::cout << "Container print: [";
        bool first = true;
        for (const auto& item : container) {
            if (!first) std::cout << ", ";
            std::cout << item; // 這里假設(shè)容器的元素也是 Printable 的
            first = false;
        }
        std::cout << "]" << std::endl;
    }
    
    // print_item(123); // 調(diào)用 Generic print
    // print_item(std::vector<int>{1, 2, 3}); // 調(diào)用 Container print
    登錄后復(fù)制

    在這個(gè)例子中,

    print_item
    登錄后復(fù)制
    函數(shù)有兩個(gè)重載版本。當(dāng)傳入
    std::vector<int>
    登錄后復(fù)制
    時(shí),它同時(shí)滿(mǎn)足
    Printable
    登錄后復(fù)制
    (因?yàn)?div id="wjcelcm34c" class="code" style="position:relative; padding:0px; margin:0px;">
    vector
    登錄后復(fù)制
    可以被
    ostream
    登錄后復(fù)制
    輸出)和
    Container
    登錄后復(fù)制
    。但是,由于
    Container
    登錄后復(fù)制
    版本的約束更“具體”或者說(shuō)更“特化”(它有更多的要求),編譯器會(huì)優(yōu)先選擇
    Container
    登錄后復(fù)制
    版本。這種機(jī)制使得泛型代碼能夠優(yōu)雅地適應(yīng)不同類(lèi)型的需求,同時(shí)保持了代碼的清晰和可維護(hù)性。

    總的來(lái)說(shuō),Concepts通過(guò)提供明確的類(lèi)型契約、支持概念的模塊化組合以及實(shí)現(xiàn)精確的約束重載,極大地提升了C++泛型代碼的維護(hù)性、可擴(kuò)展性和表達(dá)力。它讓我們的模板代碼不再是難以捉摸的“黑魔法”,而是嚴(yán)謹(jǐn)、清晰、易于協(xié)作的工程實(shí)踐。

    以上就是模板約束concepts是什么 C++20新特性實(shí)踐指南的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

    最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件
    最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件

    每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。

    下載
    來(lái)源:php中文網(wǎng)
    收藏 點(diǎn)贊
    上一篇:結(jié)構(gòu)體數(shù)組怎樣操作 批量處理結(jié)構(gòu)體數(shù)據(jù)的方法 下一篇:如何用C++開(kāi)發(fā)簡(jiǎn)易編譯器 詞法分析和語(yǔ)法樹(shù)構(gòu)建入門(mén)
    本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
    作者最新文章
    最新問(wèn)題
    相關(guān)專(zhuān)題
    更多>
    熱門(mén)推薦
    開(kāi)源免費(fèi)商場(chǎng)系統(tǒng)廣告
    熱門(mén)教程
    更多>
    最新下載
    更多>
    網(wǎng)站特效
    網(wǎng)站源碼
    網(wǎng)站素材
    前端模板
    關(guān)于我們 免責(zé)申明 意見(jiàn)反饋 講師合作 廣告合作 最新更新
    php中文網(wǎng):公益在線(xiàn)php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
    關(guān)注服務(wù)號(hào) 技術(shù)交流群
    PHP中文網(wǎng)訂閱號(hào)
    每天精選資源文章推送
    PHP中文網(wǎng)APP
    隨時(shí)隨地碎片化學(xué)習(xí)
    PHP中文網(wǎng)抖音號(hào)
    發(fā)現(xiàn)有趣的

    Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)