普通類的成員函數模板
不管是普通類還是類模板,它的成員函數可以是一個函數模板(成爲成員函數模板)。不可以是虛函數,否則編譯器會報錯。
//普通類的成員函數模板
class A
{
public:
template<typename T>
void my_ft(T tmp) //成員函數模板
{
cout << tmp << endl;
}
};
int main()
{
//普通類的成員函數模板
A a;
a.my_ft(3);
//類模板的成員函數模板
B<float> b(1, 2);
return 0;
}
類模板的成員函數模板
//類模板的成員函數模板
//類模板的模板參數必須用<>指定, 成員函數模板(函數模板)的參數都可以推斷
template<typename C>
class B
{
public:
template <typename T2>
B(T2 v1, T2 v2);//構造函數也引入自己的模板,和整個類的模板C無關
template<typename T>
void my_ft(T tmp)
{
cout << tmp << endl;
}
void my_ft_nomal()
{
}
public:
C m_ic;
};
template <typename C> //類的模板參數列表
template <typename T2>
B<C>::B(T2 v1, T2 v2) //構造函數也引入自己的模板,和整個類的模板C無關
{
cout << v1 << " " << v2 << endl;
}
int main()
{
//類模板的成員函數模板
B<float> b(1, 2);
//類模板的成員函數(包括普通成員函數/成員函數模板) 只有爲程序所用(代碼中出現了 對該函數或者該函數模板的調用時)才進行實例化該成員函數
//如果某函數從未使用,則不會實例化該成員函數
return 0;
}
模板顯式實例化/模板聲明
爲了防止在多個.cpp文件中都實例化相同的類模板,C++11提出了一種解決方法,成爲顯式實例化;
通過該方法來避免這種生成多個相同類模板實力的開銷。
函數模板與類模板類似
//顯式實例化 實例化定義 只需要在一個.cpp文件中寫就行
template B<float>; //編譯器遇到這段代碼就直接實例化出來一個A<float>
//顯式實例化 實例化聲明 其它所有.cpp文件中多用
extern template B<float>
//extern作用:不會再本文件中生成一個extern後邊所表示的模板的實例化版本代碼
//目的:告訴編譯器,已經有一個該模板的實例化版本了。需要再實例化了
template void myfunc(int x, int y);//實例化定義
extern template void myfunc(int x, int y);//實例化聲明
模板的實例化定義只有一個,實例化聲明可以有多個;