2013-02-10 30 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是只会让事情变得更糟。这是一个非常主观的观点,随时可以将我视为疯狂的疯子。