我有一個這樣的函數模板。函數模板
template<class T> T getFromString(const string& inStream)
{
istringstream stream (inStream);
T t;
stream >> t;
return t;
}
我沒有得到如何使用此功能模板。我嘗試了使用函數模板的通常方法,它給出了一個錯誤。請讓我知道這件事。
我有一個這樣的函數模板。函數模板
template<class T> T getFromString(const string& inStream)
{
istringstream stream (inStream);
T t;
stream >> t;
return t;
}
我沒有得到如何使用此功能模板。我嘗試了使用函數模板的通常方法,它給出了一個錯誤。請讓我知道這件事。
您可以使用它像這樣:
std::string a = "11";
int n = getFromString<int>(a);
這將提取該字符串的整數值。
順便說一句,在模板內部使用T t = T();
是很好的,因爲即使extaction失敗,它也會保證基本數據類型的初始化。
發動升壓功率:
int n = boost::lexical_cast<int>("11");
的問題是,編譯器不能使用返回類型推斷類型的功能。您需要明確提供您希望作爲函數調用的一部分的類型,如@Naveen已經提到的:getFromString<int>("123")
。另一種方法是改變函數簽名,這樣,而不是返回其接收到的類型作爲參數的:
template <typename T>
void getFromString(const std::string & str, T & value) { ... }
int main() {
int x;
getFromString("123",x);
}
正如你提供呼叫T
類型的變量,編譯器現在能夠從推斷類型參數。 (x
是int
,所以你打電話getFromString<int>
)。缺點是你需要預先創建變量和用戶代碼將更加複雜的簡單用例如int n = getFromString<int>("123");
雖然這是很好的建議,它沒有回答這個問題。 – 2010-08-03 06:45:36
不是,雖然你可以注意到使用是完全一樣的。不過,我堅信不要重新發明輪子,特別是當因爲仔細調整''lexical_cast'對於整數類型可能快得多的時候;) – 2010-08-03 06:52:50