std :: stringstream和str方法

Fal*_*lco 15 c++ stringstream

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

stringstream ss ;
ss << "my string" ;
cout << ss.str() << endl ;
Run Code Online (Sandbox Code Playgroud)

不等于

cout << (stringstream() << "my string").str() << endl ;
Run Code Online (Sandbox Code Playgroud)

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

我不能轻易解释这一点.这对我的应用程序并不重要,但我很确定这隐藏了一个有趣的c ++技巧.

注意:我正在使用gcc和c ++ 14

Dan*_*rey 22

operator<<用于限定std::stringstream,但对于它的基类std::ostream的,因此它不返回到一个基准std::stringstream,因此,方法str()(这是的方法std::stringstream)是找不到的.

技术上,上面居然是std::basic_stringstream<CharT,Traits>std::basic_ostream<CharT,Traits>,但你的想法:)


Gal*_*lik 6

这个问题:

cout << (stringstream() << "my string").str() << endl;
Run Code Online (Sandbox Code Playgroud)

这是表达式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;
}
Run Code Online (Sandbox Code Playgroud)

现在,当你在一个对象上使用<<>>运算符时std::stringstream,它将调用这些重载并返回一个,std::stringstream&这样你就可以直接使用它的接口了.