2013-01-17 40 views
2

如何stringstream的工作,当你这样做:C++字符串流

stringstream ss; 
ss << "123" << "abc"; 

不会创建暴殄天物“123ABC”字符串或者它连续做两个操作的stringstream的?

我想复制这种功能,但没有过载我看来有两个参数,如上面的代码工作...

+0

我不是专家,但<<是stringstream类的重载操作符,所以我想通过从左到右的内容附加每个操作一次。 –

+0

您是否正在尝试为您的班级创建一个操作符<<? –

+0

是的,但默认<<超载似乎只有一个参数,如:ss <<“123”;而不是像上面的两个参数... –

回答

12

这是做< <运营商的两个不同的函数调用相当于:

(ss.operator<<("123")).operator<<("abc") 

所以是的,它可以“连续地”执行两个操作。

+0

@aschepler谢谢,明白了。 – zdan

+0

-1错误的答案。没有成员函数需要'const char *'。看到我的答案。 – Nawaz

1

std::stringstream::operator<<(const char*)返回std::stringstream&

这种技术可以让你“链接”它。

这不完全正确 - 但它几乎等同于您的目的的真相。

稍微更准确的陈述是std::stringstream& operator<<(std::stringstream&, const char*)可以被链接。

一个更准确的说法是,ostream& operator<<(ostream&, const char*)存在,std::stringstreamostream,然后对超载电话<<决议。

+0

不错,正是我在找的,谢谢! –

+0

-1错误的答案。没有成员函数需要'const char *' – Nawaz

+0

嗯,它不会让你连锁<< = ...无赖。像:ss << =“123”<<“abc”; –

5

其实这是相同的:

std::operator<<(std::operator<<(ss, "123"), "abc"); 

注意有没有成员函数,它接受const char*作为参数。它是一个非成员函数,并将ss作为第一个参数传递给它,并将const char*作为第二个参数传递。该函数返回std::ostream&然后再次传递给它。它更像这样:

print(print (ss, "123"), "abc"); //just for clarity 

这意味着有两个函数调用。将print替换为std::operator<<。现在一切都会清楚。

希望有所帮助。


其他答案,这样说:

(ss.operator<<("123")).operator<<("abc") //copied from other answer (wrong) 

是错误的!这是错误的,因为它假定operator<<这需要const char*作为参数是一个成员函数,这是不正确的!