std::stringstream 和 str 方法
std::stringstream and the str method
我在尝试使用 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
未找到 operator<<
is not defined for std::stringstream
, but for its base class std::ostream
, hence it does not return a reference to the std::stringstream
and therefore the method str()
(这是 std::stringstream
的方法)。
从技术上讲,上面实际上是 std::basic_stringstream<CharT,Traits>
和 std::basic_ostream<CharT,Traits>
,但你明白了:)
这个问题:
cout << (stringstream() << "my string").str() << endl;
表达式stringstream() << "my string"
return是一个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
对象上使用 <<
和 >>
运算符时,它将调用这些重载,它们将 return 一个 std::stringstream&
这样就可以直接使用它的接口了。
我在尝试使用 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
未找到 operator<<
is not defined for std::stringstream
, but for its base class std::ostream
, hence it does not return a reference to the std::stringstream
and therefore the method str()
(这是 std::stringstream
的方法)。
从技术上讲,上面实际上是 std::basic_stringstream<CharT,Traits>
和 std::basic_ostream<CharT,Traits>
,但你明白了:)
这个问题:
cout << (stringstream() << "my string").str() << endl;
表达式stringstream() << "my string"
return是一个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
对象上使用 <<
和 >>
运算符时,它将调用这些重载,它们将 return 一个 std::stringstream&
这样就可以直接使用它的接口了。