簡述
-
類模板:是類類型的模板,如:
vector。 -
模板類:類模板的實例化,如:
vector<int>。 - 類模板的模板參數(shù)無法通過模板參數(shù)自動推斷來確定,必須顯式指定。
定義
類模板的定義和聲明必須放在頭文件中
template<typename T>
class A {
public:
A();
void fun1();
void fun2() {} // 定義在模板內(nèi)部
};
template<typename T>
A<T>::A() {
}
template<typename T>
void A<T>::fun1() {
}
特化
代碼
template <typename T>
class A {
public:
A() { std::cout << "A<T>" << std::endl; }
};
template <>
class A<double> {
public:
A() { std::cout << "A<double>" << std::endl; }
};
int main() {
A<int> a1;
A<double> a2;
return system("pause");
}
輸出結(jié)果
A<T>
A<double>
特化成員函數(shù)
template <typename T>
class A {
public:
void fun() {
std::cout << "A<T>::fun()" << std::endl;
}
};
// 只特化類模板的部分成員
template <>
void A<int>::fun() {
std::cout << "A<int>::fun()" << std::endl;
}
前置聲明與友元聲明
// 前置聲明不需要給出模板參數(shù)
template <typename> class A1;
template <typename> class A2;
template <typename T>
class B {
public:
friend class A1<T>; // 一對一友元關(guān)系
friend class A2<int>; // 多對某一友元關(guān)系
template <typename> friend class A3; // 多對多友元關(guān)系,也有前置聲明的作用
};
// 類模板的特化
template <>
class B<int> {
public:
friend class A2<int>; // 某一對某一友元關(guān)系
template <typename> friend class A3; // 某一對多友元關(guān)系,也有前置聲明的作用
};
可以省略模板實參的情況
template <typename T>
class A {
public:
// 類模板作用域內(nèi)可以直接使用類模板名字而不必提供模板參數(shù)
// 即模板作用域內(nèi)直接使用類模板名A時,編譯期會解讀為A<T>
A fun1(A a) {
A b;
return b;
}
A fun2(A a);
};
// 類模板作用域外不可以直接使用類模板名A取代A<T>
template <typename T>
A<T> A<T>::fun2(A a) {
// 類模板成員函數(shù)的形參列表及其函數(shù)體屬于類模板作用域內(nèi)
A b;
return b;
}
模板類型別名
template <typename T> using name1 = pair<T, T>;
template <typename T> using name2 = pair<T, char>;
int main() {
name1<int> t1; // t1是一個pair<int, int>
name2<int> t2; // t2是一個pair<int, char>
return system("pause");
}
使用模板參數(shù)的類型成員
class A {
public:
typedef int value_type;
};
template <typename T>
class B {
public:
typedef typename T::value_type type;
typename T::value_type fun() {
return typename T::value_type();
}
};
默認模板實參
template <typename T = int, typename F = double>
class A {
};
int main() {
A<> a1; // A<int, double>
A<double> a2; // A<double, double>
A<string, string> a3; // A<string, string>
return system("pause");
}
顯式實例化
顯式實例化類模板時會顯式實例化其所有成員。
// 顯式實例化的作用是避免編譯器多次重復(fù)實例化啊,可以達到加快編譯速度的效果
// 下述代碼不能同時出現(xiàn)在一個文件中
template class A<int>; // 定義,代表在此處將類模板A實例化為A<int>
extern template class A<int>; // 聲明,代表承諾在別的文件中有個A<int>實例化