2010-08-03 109 views
0

我有一個這樣的函數模板。函數模板

template<class T> T getFromString(const string& inStream) 
{ 
    istringstream stream (inStream); 
    T t; 

    stream >> t; 
    return t; 
} 

我沒有得到如何使用此功能模板。我嘗試了使用函數模板的通常方法,它給出了一個錯誤。請讓我知道這件事。

回答

4

您可以使用它像這樣:

std::string a = "11"; 
int n = getFromString<int>(a); 

這將提取該字符串的整數值。

順便說一句,在模板內部使用T t = T();是很好的,因爲即使extaction失敗,它也會保證基本數據類型的初始化。

1

發動升壓功率:

int n = boost::lexical_cast<int>("11"); 
+0

雖然這是很好的建議,它沒有回答這個問題。 – 2010-08-03 06:45:36

+0

不是,雖然你可以注意到使用是完全一樣的。不過,我堅信不要重新發明輪子,特別是當因爲仔細調整''lexical_cast'對於整數類型可能快得多的時候;) – 2010-08-03 06:52:50

0

的問題是,編譯器不能使用返回類型推斷類型的功能。您需要明確提供您希望作爲函數調用的一部分的類型,如@Naveen已經提到的:getFromString<int>("123")。另一種方法是改變函數簽名,這樣,而不是返回其接收到的類型作爲參數的:

template <typename T> 
void getFromString(const std::string & str, T & value) { ... } 
int main() { 
    int x; 
    getFromString("123",x); 
} 

正如你提供呼叫T類型的變量,編譯器現在能夠從推斷類型參數。 (xint,所以你打電話getFromString<int>)。缺點是你需要預先創建變量和用戶代碼將更加複雜的簡單用例如int n = getFromString<int>("123");