模板是 C++ 泛型編程的核心。本文通過完整示例,系統梳理模板類的定義、顯式特化、偏特化、巢狀模板、模板模板參數等進階用法。
template <class T1, class T2 = string>
class Test {
T1 val1; T2 val2;
public:
Test() {}
Test(T1 a, T2 b) : val1(a), val2(b) {}
void show();
};
// 類外定義成員函數
template <class T1, class T2>
void Test<T1, T2>::show() {
cout << "原始模板" << endl;
cout << val1 << endl << val2 << endl;
}
為特定類型提供完全不同的實現:
template <>
class Test<int, int> {
int val1, val2;
public:
Test() {}
Test(int a, int b) : val1(a), val2(b) {}
void show() {
cout << "全特化 int,int" << endl;
cout << val1 << endl << val2 << endl;
}
};
僅固定部分模板參數:
template <class T>
class Test<T, double> {
T val1; double val2;
public:
Test() {}
Test(T a, double b) : val1(a), val2(b) {}
void show() {
cout << "偏特化 T,double" << endl;
cout << val1 << endl << val2 << endl;
}
};
template class Test<double, double>; // 強制編譯器生成該具體類型的代碼,不與特化衝突
template <class T1>
class Outer {
template <class T2>
class Inner {
T2 data;
public:
Inner(T2 d) : data(d) {}
void show() { cout << data << endl; }
};
Inner<T1> member;
public:
Outer(T1 d) : member(d) {}
void show() { member.show(); }
};
接受模板作為參數,增強泛化能力:
template <template <class, class> class Container>
class Wrapper {
Container<int, int> obj;
public:
Wrapper(Container<int, int> o) : obj(o) {}
void show() { obj.show(); }
};
int main() {
// Test<int> a(1, "str"); // 使用默認 string
// Test<double, double> b(5, 6); // 隱式實例化
// Test<int, int> c(5, 6); // 匹配全特化
// Test<int, double> d(1, 2.1); // 匹配偏特化
// Outer<int> e(1); // 巢狀模板
// Test<int, int> f(1,2); Wrapper<Test> g(f); // 模板模板參數
return 0;
}