<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## [$]一.實例化 ### 1.隱式實例化 模板被使用時,進行的模板的實例化。 對于類模板,若成員函數不使用,則不會進行實例化。 + **發生時機** 模板被使用時。 + **缺點** 相同的模板實例可能出現在多個對象文件中,造成了一定的額外開銷。 #### 例1 ```c++ template <typename T> T add(const T &t1,const T &t2) { return t1+t2; } ``` 調用: ```c++ f(200,700);//隱式實例化 f<int>(300,600);//隱式實例化:盡管指定了模板實參,但模板仍在被使用時才進行實例化。 ``` ### [11+]2.顯式實例化 1. 聲明顯式實例化:告訴編譯器在其他地方有顯式實例化的定義。 + 必須出現在使用之前,防止使用時的初始化。 ```c++ extern template class Array<int>;//類模板顯式聲明 extern template int add(const int &,const int &);//函數模板顯式聲明 ``` 2. 定義顯式實例化:只能定義一次,此時編譯器會為該模板生成代碼。 + 當顯式實例化類模板時,會實例化所有的成員函數。 ```c++ template class Array<int>;//類模板顯式定義 template int add(const int &,const int &);//函數模板顯式定義 ``` ## [$]二.模板特例化 ### 1.基本概念 1. **概念** 模板特例化是函數模板、類模板、成員模板的 **重定義** ,其中指定了部分或全部模板參數。 2. 模板特例化版本必須出現在原模板的聲明之后。 3. 模板特例化的本質是實例化一個模板,而非重載它。 4. 當編譯器匹配到特例化的版本時,編譯器會直接使用特例化的版本,而不是重新實例化原來的模板。 ### 2.函數模板特例化 當我們特例化一個函數模板時,必須為原模板中的每個模板參數都提供模板實參。且提供的模板實參必須與模板匹配。 #### 例2 下面是一個函數的多個定義,以支持字符串、字符數組的比較。 ```c++ //通用模板 template <typename T> int compare(const T &t1, const T &t2) { cout << "調用第一個版本" << endl; if (t1 > t2) return 1; if (t1 == t2) return 0; if (t1 < t2) return -1; return 0; } //這是重載,不是特例化,用于字符數組的傳入 template <unsigned N1, unsigned N2> int compare(const char (&p1)[N1], const char (&p2)[N2]) { cout << "調用第二個版本" << endl; return strcmp(p1, p2); } //特例化的模板,T=const char *,用于字符指針的傳入 template <> int compare(const char *const &p1, const char *const &p2) { cout << "調用第三個版本" << endl; return strcmp(p1, p2); } ``` 調用: ```c++ const char *p1 = "apple"; const char *p2 = "zoo"; cout << compare(10, 9) << endl; cout << compare("apple", "zoo") << endl; cout << compare(p1, p2) << endl; ``` >[test] >調用第一個版本 >1 >調用第二個版本 >-1 >調用第三個版本 >-1 ### 3.類模板特例化 + 與函數模板不同,類模板的特例化不必為所有模板參數提供實參。 + 一個類模板的部分特例化本身是一個模板,使用它時還須提供其余的模板實參。 ```c++ //模板 template <typename T> class A { //code }; //特例化 class A<char *> { //code }; //部分特例化 template <typename T> class A<T&> { //code }; ``` ### 4.特例化成員 + 與函數模板類似,需要提供全部模板實參。 ```c++ template <typename T> class Array { private: static int size; //其他數據成員... public: void output() { //code } //其他函數... }; //特例化成員函數 template <> Array<int>::output() { //code } //特例化靜態數據成員 template <> Array<int>::size = 20; ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看