2010-08-10 106 views
8

我有一個小問題,模板:C++模板默認構造

template <typename T> 
T Func(){ 
    std::string somestr = ""; 
    // somestr = ... 
    if (somestr != ""){ 
     return boost::lexical_cast<T>(somestr); 
    } 
    else{ 
     T ret; // warning: "ret may be uninitialized in this function" 
     return ret; 
    } 
} 

如果此功能無法得到的結果,我想返回一個有效的對象,但空如可能的。如果我像上面那樣做,我會收到警告「ret可能在此函數中未初始化」。 Try-Catch並沒有幫助刪除警告..

有沒有像C#中的default關鍵字的方式嗎?

return default(T); // C# 

謝謝!

回答

21

ret可能未初始化,因爲T可能是POD類型或另一種沒有用戶聲明構造函數的類型。

可以調用默認的構造(和值初始化任何POD類型的對象),如下所示:

T ret = T(); 
return ret; 

,或者更簡潔地說,

return T(); 

這假定T是默認constructible 。如果您可能需要使用非默認可構造類型實例化此函數,則可以將「默認」情況作爲參數。例如,

template <typename T> 
T Func(const T& default_value = T()) 
{ 
    // ... 
} 

這將允許你還是打電話Func()的是缺省構造的類型,但也明確地提供一個值來返回不屬於的類型。

+2

很好的答案James。 – user373215 2010-08-10 01:28:35