2011-10-19 84 views
0

假定以下虛擬模板:模板類型的C++ /模板/顯式初始化?

template < class DataType > class Dummy 
{ 
public: 
    void init() 
    { 
     m_data = DataType(0); 
    } 

private: 
    DataType m_data; 
}; 

調用init將初始化內部數據。當DataType是標準數據類型(例如int或float)時,這確實工作正常。當DataType是一個類時,這個類必須有一個對應的構造函數。

現在假定DataType應該是例如。由合適的班級代表的複數。在這種情況下,爲複數類構造函數提供一個參數是沒有意義的,因爲在正常情況下,您需要初始化實部和虛部。

所以我的問題是: 什麼是最好的通用方式來初始化模板類型考慮到模板應適合存儲任何數據類型。

我想STL必須實現這樣的想法,但我迷失在該代碼中。

+0

這取決於,你有一個支持C++ 11的編譯器嗎? –

+0

不,我沒有。 – Mark

回答

5

在您的例子我猜你的意思是:

DataType(0); 

不:

Data (0); 

在任何情況下,請嘗試:

m_data = DataType(); 

,將調用默認的構造函數的一類類型,或者對於內置類型將爲零初始值。

+2

+1:然後你必須要求任何通過參數的類都是default-constructible,這是一個合理的要求(標準在幾個地方使用,例如'std :: map's value-type)。 –

+0

鑑於'init' mem-func的形式,似乎默認構造是類設計的一個要求。 –

+0

太好了!我不知道內置類型以這種方式被初始化爲零。所以我將使用默認的構造函數。 – Mark

0

實際上,您正在考慮使用「默認可構造」類,也就是說,可以使用有效的類特定輸入進行初始化的類。 STL是根據這個術語編寫的,正如@DanielEarwicker所寫,默認構造函數是爲內置類型定義爲零初始化的。

因此,要獲得這樣的功能,您的複數類必須支持默認構造函數,即不帶參數的構造函數。

1

你可以使用一個默認說法爲:

template <class T> 
class A 
{ 
public: 
    void init(T c = T()) //default argument 
    { 
     m_data = c; 
    } 
private: 
    T m_data; 
}; 

如果模板參數類型T是用戶定義類型,並且它沒有定義默認構造函數,那麼你必須自己傳遞一個參數到init()函數,否則會得到編譯錯誤。

這是標準庫採用的方法。例如,std::vector::resize()採用與上述相同的基本原理的可選參數。