2013-02-10 29 views
4

在我看來,定義運算符(運算符<)要直接使用字符串比使用ostringstreams然後轉換回字符串更優雅。有沒有一個原因,爲什麼c + +不開箱即用?爲什麼字符串類沒有預定義<<運算符(運算符<<),以便字符串像ostringstream一樣工作?

#include <string> 
#include <sstream> 
#include <iostream> 
using namespace std; 

template <class T> 
string& operator<<(string& s, T a) { 
    ostringstream ss; 
    ss << a; 
    s.append(ss.str()); 
    return s; 
} 
int main() { 
    string s; 
    // this prints out: "inserting text and a number(1)" 
    cout << (s << "inserting text and a number (" << 1 << ")\n"); 

    // normal way 
    ostringstream os; 
    os << "inserting text and a number(" << 1 << ")\n"; 
    cout << os.str(); 
} 
+0

好,那你必須實現所有的操縱(你知道,你用來設置字段寬度的小功能)重新開始。代碼重複是一個可怕的浪費。 – 2013-02-10 07:04:02

+0

此外,使用新的C++ 11標準,它不是一個問題,因爲您可以將['operator +'](http://en.cppreference.com/w/cpp/string/basic_string/operator%2B)與['的std :: to_string'](http://en.cppreference.com/w/cpp/string/basic_string/to_string)。 – 2013-02-10 07:06:11

回答

2

字符串輸出流的問題是,它們會變得太重。

字符串旨在「保存字符串數據」,而不是格式化某些輸出。輸出流有一個很重的「狀態」,可以被操縱(見<iomanip>),因此必須存儲。這意味着當然,這必須在每個程序中每字符串存儲爲,但幾乎沒有一個用作輸出流;所以這是一個巨大的資源浪費。

C++遵循「零開銷」的設計原則(或至少沒有比完全必要的更多的開銷)。沒有一個不會增加任何不必要開銷的字符串類將違反這個設計原則。如果是這樣的話:人們會在高開銷情況下做什麼?使用C字符串...哎!

在C++ 11中,另一種方法是使用operator+=std::to_string附加到一個字符串,該字符串也可以像輸出流的operator<<一樣鏈接。你可以用一個漂亮的operator<<+=to_string字符串,如果你喜歡:

template <class Number> 
std::string& operator<<(std::string& s, Number a) { 
    return s += std::to_string(a); 
} 
std::string& operator<<(std::string& s, const char* a) { 
    return s += a; 
} 
std::string& operator<<(std::string& s, const std::string &a) { 
    return s += a; 
} 

你的榜樣,使用這種方法更新:http://ideone.com/4zbVtD

0

在時間的深處可能失去,但現在格式化輸出爲總是流於C相關聯(因爲他們沒有「真正」的字符串),這可能已經結轉到C++(其畢竟C是帶班的)。在C中,格式化爲字符串的方式是使用sprintf,即fprintf的變體,即輸出到流的函數。

很明顯是我猜想的猜想,但有人可能認爲和你自己類似,這些流中的這些格式化的東西對於字符串來說也是很棒的,所以他們將子類劃分成了一個使用字符串的類,因爲它的輸出」。

這似乎是讓它儘快工作的優雅解決方案。否則,你會有格式化代碼在流和字符串中重複。

3

流包含附加狀態。試想一下,如果這是可能的:

std::string str; 
int n = 1234; 
str << std::hex; 
str << n; 
return str; // returns "0x4d2" (or something, I forget) 

爲了保持這種額外的狀態,字符串就必須有這個狀態存儲。 C++標準委員會(以及一般的C++程序員)一般都以不必要的資源消耗爲幌子,在「只爲你使用的東西付費」的座右銘之下。所以,字符串類中沒有額外的字段。

主觀答案:是,我覺得std::string類的設計很糟糕,首先,特別是相對於C++的優秀標準庫的其他部分,並添加新的特性std::string是隻會讓事情變得更糟。這是一個非常主觀的觀點,隨時可以將我視爲瘋狂的瘋子。