2017-04-13 44 views
5

我剛剛纔知道C++在<string>中定義了std::to_string()。現在我想知道爲什麼to_string()只適用於數字類型。有沒有什麼特別的原因,爲什麼沒有更一般的爲什麼數字類型只有`to_string()`?

template <typename T> 
std::string to_string(const T& t); 

可以實現這樣的:

template <typename T> 
std::string to_string(const T& t) { 
    std::ostringstream s; 
    s << t; 
    return s.str(); 
} 

我懷疑,這樣的一般to_string不存在,因爲它很容易寫你自己的,但同樣的道理也適用於to_string()採取intdouble,等等。

+0

只是我的兩分錢......但是這些功能太有限了,不值得在std裏面......像Boost.Format或lexical_cast這樣的東西會很多,我的意思是更有用。這些to_string函數非常基本,只在最基本的場景中有用,這意味着它們在現實生活中是無用的。 – rubenvb

+7

不要被一票拋棄。可能只是一個糟糕的一天。 –

+3

其實,有關於這個問題的建議http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0117r0.html,但不要以爲有人會接受 – DAle

回答

4

由於std::to_string()的要求。

作爲標準狀態:

string to_string(int val);

string to_string(unsigned val);

string to_string(long val);

string to_string(unsigned long val);

string to_string(long long val);

string to_string(unsigned long long val);

string to_string(float val);

string to_string(double val);

string to_string(long double val);

返回:每個函數返回一個字符串對象保持將由 主叫來生成其自變量的值的字符 表示帶格式說明符「%d」,「%u」的sprintf(buf,fmt,val), , 其中,buf表示內部字符緩衝區充足,其中「%ld」,「%lu」,「%lld」,「%llu」,「尺寸。

編寫一個可以確定需要使用的說明符的模板化函數使得事情不必要的複雜化。

3

只是想添加到Gill Bates answer我發現在this proposal(感謝@DAle的鏈接)。

該提案是關於添加一個通用的to_string方法。他們講的當然是一個真正的泛型方法,但是它的原理與我的樸素的泛型方法相同:在引擎蓋下,一個流用於從任何可以流式處理的對象獲取字符串。

由於提案C++後11來了,加入這樣的方法會對他們寫現有to_string,並在部分「的標準衝擊」的影響:

[...]的舊的和新的功能可以共存,依賴於過載 分辨率以在 匹配參數類型的情況下優先選擇非模板(現有)版本。

to_string(0);  // before: calls to_string(int), now: calls to_string(int) 
to_string(false); // before: calls to_string(int), now: calls to_string<bool>(bool&&) 
to_string('0'); // before: calls to_string(int), now: calls to_string<char>(char&&) 

雖然效果是前兩種情況相同(結果是 總是「0」),在最後:然而,兼容性問題可能在 情況下一些不同的,但隱式轉換參數類型的出現一個結果將從「48」 (假定ASCII編碼)變爲「0」。有幾種方法來處理 問題的專業化情況下,像這樣:

然後他們列出一些選項(包括忽略的問題)出的這恕我直言,沒有人會真正令人滿意。 Imho它的可惜,to_string,因爲它首先將它製作成標準。另一方面,吉爾貝茨的答案給出了一個很好的理由,爲什麼它從一開始就不是通用的(如果它應該生成字符串,就好像sprintf被使用,它通常不是微不足道的,也許是不可能的)。

相關問題