【C/C++】【模板和泛型】成員函數模板

普通類的成員函數模板

不管是普通類還是類模板,它的成員函數可以是一個函數模板(成爲成員函數模板)。不可以是虛函數,否則編譯器會報錯。

//普通類的成員函數模板
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);//實例化聲明

模板的實例化定義只有一個,實例化聲明可以有多個;

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