std::stringstream and the str method

std::stringstream and the str method

本文关键字:str method the and stringstream std      更新时间:2023-10-16

我在尝试使用字符串流对象时注意到了一些东西。这里有一个无用的例子来解释这一点:

stringstream ss ;
ss << "my string" ;
cout << ss.str() << endl ;

不等同于

cout << (stringstream() << "my string").str() << endl ;

这会导致编译错误,抱怨"类 std::basic_ostream"没有名为"str"的成员。

我无法轻松解释这一点。这对我的应用程序来说并不重要,但我很确定这隐藏了一个有趣的 c++ 技巧。

注意:我正在使用带有 c++14 的 gcc

operator<<不是std::stringstream定义的,而是为它的基类std::ostream定义的,因此它不返回对std::stringstream的引用,因此找不到方法str()(这是一种std::stringstream的方法)。

从技术上讲,以上实际上是std::basic_stringstream<CharT,Traits>std::basic_ostream<CharT,Traits>,但你明白了:)

这个问题:

cout << (stringstream() << "my string").str() << endl;

表达式stringstream() << "my string"返回一个std::ostream&对象,而不是一个std::stringstream

您可以通过定义一些适当的重载来纠正此问题:

template<typename Type>
std::stringstream& operator<<(std::stringstream& ss, const Type& type)
{
static_cast<std::ostream&>(ss) << type;
return ss;
}
template<typename Type>
std::stringstream& operator<<(std::stringstream&& ss, const Type& type)
{
static_cast<std::ostream&>(ss) << type;
return ss;
}
template<typename Type>
std::stringstream& operator>>(std::stringstream& ss, Type& type)
{
static_cast<std::istream&>(ss) >> type;
return ss;
}
template<typename Type>
std::stringstream& operator>>(std::stringstream&& ss, Type& type)
{
static_cast<std::istream&>(ss) >> type;
return ss;
}

现在,当您在std::stringstream对象上使用<<>>运算符时,它将调用这些重载,它们将返回一个std::stringstream&以便您可以直接使用其接口。