std :: stringstream和str方法

时间:2015-05-05 23:44:54

标签: c++ stringstream

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

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

不等于

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

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

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

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

2 个答案:

答案 0 :(得分:22)

operator<<为<{3}}定义了 ,但是对于其基类std::stringstream,因此它不会返回对std::stringstream的引用因此找不到方法std::ostream(这是std::stringstream的方法)。

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

答案 1 :(得分: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&以便您可以使用它界面直接。