<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      模板全特化與偏特化的概念

      前言

      之前我在學習STL的時候,發現STL用到了大量的類模板、函數模板。對于模板而言,我們知道,當用戶傳遞類型后,模板會進行自動類型推演,但是作為一個模板初學者,我有時候并不能確定模板一定會按照我的思路去推導出符合我預期的類型,所以有時候編寫的模板能夠涵蓋的類型過多反而也不是一件好事(如果代碼出現錯誤,很難察覺到),那么為了讓編譯器更加精準了解我們想要的類型,我們就可以對模板進行特化(特例化),讓編譯器更加精確限定我們需要的模板類型,讓模板的泛型不那么“泛”。

      本文主要介紹模板的特化(完全特化及偏特化)在類和函數中是什么樣的情況。說白了我其實是想梳理一下C++綁定器和C++11的function機制,為此才寫本篇文章,做一些前置的知識鋪墊。

      關于為什么要用模板以及模板的好處在哪?模板實際上就是宏定義的衍生,相比宏,其還可以進行類型檢查,更安全,這里就不再過多贅述,可參考:[??模板特化的概念從何而來]

      模板特化

      模板為什么要特化,因為編譯器認為,對于特定的類型,如果你能對某一功能更好的實現,那么就該聽你的。

      模板分為類模板與函數模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體類型,偏特化就是如果這個模板有多個類型,那么只限定其中的一部分

      類模板(全特化、偏特化)

      類模板的類型傳遞通過<>傳遞,那么類模板配合特化使用后,產生的全特化和偏特化可以看下面的代碼,全特化指的是我要對模板傳遞的所有類型進行明確的指定,即下面代碼的第二部分,同時制定了T1為int,T2為char;偏特化指的是只對模板的部分類型進行明確指定,即下面代碼的第三部分,指定第一個參數為char,第二個參數依舊保持T2,讓模板自動推導。

      // 類模板
      template<typename T1, typename T2>
      class Test {
      public:
      	Test(T1 i, T2 j) : a(i), b(j) { cout << "模板類" << endl; }
      private:
      	T1 a;
      	T2 b;
      };
      
      // 類模板全特化
      template<>
      class Test<int, char> {
      public:
      	Test(int i, char j) : a(i), b(j) { cout << "全特化" << endl; }
      private:
      	int a;
      	char b;
      };
      
      // 類模板偏特化
      template <typename T2>
      class Test<char, T2> {
      public:
      	Test(char i, T2 j) : a(i), b(j) { cout << "偏特化" << endl; }
      private:
      	char a;
      	T2 b;
      };
      

      那么下面3句依次調用類模板、全特化與偏特化:

      Test<double, double> t1(0.1, 0.2); // 類模板
      Test<int, char> t2(1, 'A'); // 模板全特化
      Test<char, bool> t3('A', true); // 模板偏特化
      

      函數模板(只有全特化)

      而對于函數模板,卻只有全特化,不能偏特化:

      //模板函數
      template<typename T1, typename T2>
      void fun(T1 a , T2 b) {
      	cout << "模板函數" << endl;
      }
      
      //全特化
      template<>
      void fun<int, char >(int a, char b) {
      	cout << "全特化" << endl;
      }
      
      //函數不存在偏特化:下面的代碼是錯誤的
      /*
      template<typename T2>
      void fun<char, T2>(char a, T2 b) {
      	cout << "偏特化" << endl;
      }
      */
      

      為什么函數不能偏特化呢?似乎不是因為語言實現不了,而是因為偏特化的功能可以通過函數的重載完成。

      總結

      以上就是對類模板特化和函數模板特化使用方式的介紹,對模板特化有了一個概念上的認識。那么全特化其實也就是一個“披著空空如也的template<>的普通函數或類”。其實模板的使用場景一定是非常復雜的,我所接觸的模板場景也并不多,本篇主要是對模板特化概念層面的總結,哎,C++語法可真多,你問我為什么要學C++,純純是靠情懷硬撐著(因為可以裝逼)。

      posted @ 2022-10-13 17:27  miseryjerry  閱讀(754)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 中国少妇嫖妓BBWBBW| 国产成人精品手机在线观看| 日本高清一区二区三| 东乌珠穆沁旗| 久久久久香蕉国产线看观看伊| 香蕉久久久久久av成人| 免费无码黄网站在线观看| 亚洲日本va午夜蜜芽在线电影| 久久精品国产88精品久久| 久久精品不卡一区二区| 柳州市| 成人免费xxxxx在线观看| 亚洲av伊人久久综合性色| 精品视频福利| 无码丰满人妻熟妇区| 成人久久精品国产亚洲av| 在线观看中文字幕码国产| 韩国免费A级毛片久久| 日韩深夜免费在线观看| 亚洲第一视频区| 亚欧乱色国产精品免费九库| 老鸭窝在线视频| 国产成人高清亚洲综合| 亚洲欧美国产日韩天堂区| 国产高在线精品亚洲三区| 四虎影视一区二区精品| 肥乡县| 色综合久久人妻精品日韩| 成在线人视频免费视频| 人妻中文字幕不卡精品| 久久精品国产亚洲AV瑜伽| 欧美变态另类zozo| 无码中文av波多野结衣一区| 97亚洲熟妇自偷自拍另类图片| 99精品国产一区在线看| 国产成人精品免费视频app软件| 界首市| 无码国产精品一区二区av| 五月天国产成人av免费观看| 欧美人禽zozo动人物杂交| av老司机亚洲精品天堂|