2013-04-14 71 views
0

例如,我有這樣的代碼,它把來自串數:如何根據內部代碼更改返回類型? (字符串數轉換)

#include <sstream> 

template <typename T> 
T string_to_num(const string &Text, T defValue = T()) 
{ 
    stringstream ss; 
    for (string::const_iterator i=Text.begin(); i!=Text.end(); ++i) 
     if (isdigit(*i) || *i=='e' || *i=='-' || *i=='+' || *i=='.') 
      ss << *i; 
    T result; 
    return ss >> result ? result : defValue; 
} 

問題是它需要兩個參數,第二這使得它的線索數目的什麼類型的我我正在返回(一個int或一個浮點數等)。

我該如何做到這一點,如果該字符串包含一個小數'。'它返回一個十進制數據類型(例如float),否則返回一個完整的數據類型(例如int)?

除非有人有更好的代碼,他們可以共享這樣做..?

+2

那是不可能的。字符串是一個運行時值,而類型是在編譯時本身確定的。不過你可以使用boost :: any。 – Nawaz

+0

或'boost :: variant',如果你有一組有限的類型。或者,您可以使用其中一種類型來調用函子。 – Yakk

+0

您必須知道類型並調用函數:'strint_to_num (「2.3」);'。刪除函數的第二個參數,因爲它是多餘的。 – iammilind

回答

0

問題是爲什麼你需要這個。我想你想的那樣,只是爲了呼籲string_to_num之前擺脫指示類型:

????? number = string_to_num<double>("123.21"); 
^^^^^ 
do_something(number); 

但是,你已經被<double>指示類型。一個簡單的語法糖,auto是你想要的。 (它的編譯時間)

否則,你需要一個變種類型,並從string_to_num定義遠遠。它有很多開銷。

你的代碼已經OK了,輸出基於T。所以,在真正的節目中你沒有問題。

+0

最後一句話,這個問題下的評論是值得的。 – deepmax

+0

如果OP提供一個參數,編譯器可以從中推導出模板參數,則不需要用「」明確指定它。也許他只是不知道明確指定類型是可能的,所以我認爲你回答了他們的問題。 –

相關問題