C++模板的匹配規則----最特殊

  C++模板技術讓C++也能實現模板元編程,即在編譯期間完成判斷和計算。凡事總有特例,模板是爲了匹配最一般的情況,但是針對特殊情況需要做優化,則需要特殊處理,這稱爲模板的特化。當模板特化後,一個調用可能會符合不同的模板,這樣就需要選擇正確的模板。C++中模板的匹配規則是:最特化匹配。下面是是示例程序:

#include <iostream>

// General case
template<typename T0, typename T1, typename T2>
struct S {
  void id() { std::cout<<"General"<<std::endl;}
};

// Special case 1
template<typename T0, typename T1>
struct S<T0, T1, char> {
  void id() { std::cout<<"Special case #1"<<std::endl;}
};

// Special case 2
template<typename T0>
struct S<T0, char, char> {
  void id() {std::cout<<"Special case#2"<<std::endl;}
};

// Special case 3
template<typename T>
struct S<int, T, T> {
  void id() {std::cout<<"Special case #3"<<std::endl;}
};

int main(int argc, char**argv) {

  S<float, float, float>().id();
  S<int, int, int>().id();
  S<int, int, char>().id();
  S<char, char, char>().id();
  // S<int, char, char>().id(); /* compile error, can not decide which one is more special */

  return EXIT_SUCCESS;
}

  上述總共5組調用,其中第5組由於編譯器無法決定模板的特殊性順序,編譯錯誤。

  1. S<float, float, float>匹配General case
  2. S<int, int, int>匹配Special case3
  3. S<int, int, char>匹配Special case1
  4. S<char, char, char>匹配Special case2

  本文完。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章