std::stringstream and the str method

15

我在尝试使用stringstream对象时注意到了一些事情。这里有一个无用的例子来解释这个问题:

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

不等于

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

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

我很难解释这个问题。这对我的应用程序并不重要,但我相信这隐藏了一个有趣的c++技巧值得理解。

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


解决方案:static_cast< stringstream & >(stringstream() << "my string").str()。或者,你知道的,使用命名变量。 - Potatoswatter
最后显然,我只是在寻找解释时走错了路。 - Falco
2个回答

22
operator<<并没有为std::stringstream定义,但是已经定义了它的基类std::ostream,因此它不会返回对std::stringstream的引用,因此找不到std::stringstream的方法str()
从技术上讲,上述实际上是std::basic_stringstream<CharT,Traits>std::basic_ostream<CharT,Traits>,但您可以理解这个概念 :)

6
这个的问题在于:
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&,以便您可以直接使用它的接口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接