C++ 模板函數的使用

因爲C++是強類型的語言,所以不能夠像動態語言Python、lua等語言一樣,編寫一段通用的邏輯,可以將不同類型的變量傳進去直接處理。泛型編程解決了這個問題,通過設計模板,擺脫了類型的限制,提高了代碼的可重用性。
普通的模板函數:

	template<typename T> T compare(const T &a, const T &b)
	{
	    return a <= b ? a : b;
	}
	
	int i = 2, j = 4;
	int a = compare(i, j);

如果在類裏面使用模板函數:

	using namespace std;
	class Test
	{
	public:
	    Test(int nParent = 0);
	    ~Test();
	public:
	    template<typename T, typename F, typename R> bool addMap(T &pMap, F pField, R pValue);
	};
	template<typename T, typename F, typename R> bool Test:: addMap(T &pMap, F pField, R pValue)
	{
	    if(isContians(pMap, pField))
	    {
	        return false;
	    }
	    pMap.insert(pField, pValue);
	    return true;
	}

這邊需要說明幾點:

1、假設你的模板函數只在類裏面使用,模板函數的實現可以放在cpp文件中
2、駕駛你的模板函數在類外也有使用場景,模板函數的實現必須放在頭文件中,如果實現放在cpp文件中,那麼恭喜你喜提error: LNK2019: 無法解析的外部符號 "public: void __cdecl XXX 錯誤一枚,出現這個錯誤的原因是程序在編譯的時候找不到函數的實現(雖然已經聲明瞭函數)

模板函數中類型的判斷:

	template<typename T> T add(const T a, const T b)
	{
	    cout<<std::is_same<T, int>::value<<endl;
	    //上面的語句能夠判斷T是否是int類型,如果是會輸出true
	    return a + b;
	}

返回值也爲類型的模板函數的使用:

	template<typename T, typename F, typename R>  R Test:: getMapValue(T &pMap, F pField)
	{
	    return pMap.value(pField);
	}
   int a = <int>getMapValue(m_mMap, "age");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章