std::stringstream and the str method
std::stringstream and the str method
我在尝试使用字符串流对象时注意到了一些东西。这里有一个无用的例子来解释这一点:
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&
以便您可以直接使用其接口。
相关文章:
- Python str to C++ to Python str
- 通过 get-Method 访问变量在类外不起作用
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 字符串变量,比如说"字符串str",可以直接复制到数组中吗?
- 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- 解释一下 for (char c : str) 的作用?
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- Getline(cin,str)的奇怪输出
- 如何在 c++ 中理解这样的代码 [request->headers().Method()->value().getStringView())]
- 比使用 s.str().c_str() 更好的表达?
- 除以 str.length() 什么也没显示
- 没有'str'成员在 GCC 和 Clang 'std::basic_ostream<char>',但 MSVC 没有问题
- 我可以得到一个字符 * 到一个 std::sregex_iterator 匹配 str() 吗?
- C6001:使用单元化内存"str[i]"
- g++ [[noreturn]] on a virtual method
- 而(getline(fin,str)){}即使在到达eof之后仍在处理数据
- 在给定的代码中,有人可以解释一下(int i = 0; i<len; i++)count[str[i]]++的代码片段;
- 如何修复此错误? "Method 'str' could not be resolved"
- std::stringstream and the str method