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組由於編譯器無法決定模板的特殊性順序,編譯錯誤。
- S<float, float, float>匹配General case
- S<int, int, int>匹配Special case3
- S<int, int, char>匹配Special case1
- S<char, char, char>匹配Special case2
本文完。