1. 程式人生 > 實用技巧 >【C/C++】【模板和泛型】類模板

【C/C++】【模板和泛型】類模板

概述

  • 用類模板例項化一個特定的類;
  • 編譯器不能為類模板推斷模板引數,為了使用類模板,必須在模板名後用<>來提供額外的資訊;
  • 同一套程式碼,可以應付不同的資料型別;

類模板定義

  • 格式

    template <typename T, ...>
    class name
    {
        
    }
    
  • 例項化類模板的時候,必須要有類的全部資訊,包括類模板中成員函式的函式體;

類模板的成員函式

  • 類模板成員函式可以寫在類模板定義中,這些成員函式被隱式宣告為行內函數;
  • 把成員函式的函式體(函式具體實現)放在類模板的定義中;
  • 類模板一旦被例項化之後,那麼這個模板的每個例項都會有自己版本的成員函式;所以,類模板的成員函式具有和這個類模板相同的模板引數;類模板的成員函式有模板引數;
  • 如果把類模板成員函式的定義(函式體)寫在類模板定義的外邊;那麼這個成員函式的模板引數就體現出來了
  • 定義在類模板之外的成員函式必須以關鍵字template開始,後邊接類模板引數列表,同時在類名後面用尖括號<>把模板引數列表裡面的所有模板引數名列出來,如果是多個模板引數,用逗號分隔;
  • 一個類模板可能有很多成員函式,但是當例項化模板之後,成員函式只有在被使用的時候才會被例項化;沒有使用到就不會被例項化;
//vector實現
template<typename T>
class my_vector
{
public:
	typedef T* iter; //迭代器

public:
	my_vector();
	//在類模板內部使用模板名並不需要提供模板引數;也可以加
	my_vector& operator=(const my_vector&);
	//my_vector<T>& operator=(const my_vector<T>&); 

	iter begin();
	iter end();

	void func();
};


template<typename T>
void my_vector<T>::func()
{
	return;
}

//建構函式
template<typename T>
my_vector<T>::my_vector()
{

}

template<typename T>
my_vector<T>& my_vector<T>::operator=(const my_vector<T>&)
{
	return *this;
}
int main()
{
	my_vector<int> i_vec;
	return 0;
}

非型別模板引數

  • 浮點數不能做非型別模板引數;
  • 類型別一般也不允許做非型別模板引數;

template<typename T, int size = 10>
class Arr
{
private:
	T arr[size];
public:
	void func();
};

template<typename T, int size>
void Arr<T, size>::func()
{
	cout << size << endl;
	return;
}

int main()
{
	Arr<int, 100> a;
	Arr<int> b;
	return 0;
}