实现一个可被接受为std::ostringstream引用的无操作std::ostringstream
Implementing a no-op std::ostringstream that can be accepted as a std::ostringstream reference
谁能建议一种方法有一个null std::ostringstream
,避免做任何工作的参数传递给它与<<
?
有两个相关的帖子在这里实现无op std::ostream和ostream打印到任何地方,到目前为止最有希望的解决方案是https://stackoverflow.com/a/760353/826203,但当测试它
int main() {
onullstream os;
os << 666;
// std::ostringstream & oss = os; // error C2440: 'initializing' : cannot convert from 'onullstream' to 'std::ostringstream &'
oss << "hello, world";
}
只能用作os<<666
, 不能用作std::ostringstream &
。有出去的路吗?
创建非可操作流的最简单方法是实际上不创建自定义流类,而是禁用现有流。例如,您可以通过将std::ostream
的流缓冲区设置为null来禁用格式化:
std::ostringstream out;
out.std::ostream::rdbuf(0);
// any attempt to write anything to out will fail.
如果你需要一个格式化数据失败的流,你可以创建一个不存储任何字节的流缓冲区,它总是成功的。然而,当使用这个流缓冲区时,实际的格式化将被执行:
struct nullbuf: std::streambuf {
std::streambuf::int_type overflow(std::streambuf::int_type c) {
return std::char_traits<char>::not_eof(c);
}
};
// ...
nullbuf buf;
std::ostringstream out;
out.std::ostream::rdbuf(&buf);
注意,我还建议而不是让函数接受std::ostringstream
作为参数。相反,任何不构造流的函数都应该按照std::ostream&
传递。如果你现有的接口已经采用std::ostringstream
,你可以通过从std::ostringstream
派生并适当设置流缓冲区来创建一个空流:
class onullstream
: private virtual nullbuf
, public std::ostringstream {
public:
nullstring()
: std::ios(this)
, std::ostringstgream() {
this->std::ostream::rdbuf(this);
}
};
相关文章:
- 使用 C++ fmtlib,有没有比使用 std::ostringstream 更干净的方法来将数据序列附加到字符串中
- 将C弦发送到非效果STD :: OSTRINGSTREAM怪异行为
- 任何无需复制即可从 std::ostringstream 获取 std::string_view 的方法
- std::ostringstream将标志放在错误的位置
- 如何移动 std::ostringstream 的底层字符串对象?
- std::ostringstream 缓冲区的最大大小是多少
- std :: ostringstream和flush成员功能
- 带有std的内存错误:OSTRINGSTREAM和-STD = C 11
- Visual Studio: "str() is not a member of std::ostringstream"
- 使用 Visual Studio 2013 直接从 std::ostringstream 获取 const char *
- 显式指定要写入的字符串 std::ostringstream
- c++ std::ostringstream vs std::string::append
- std::ostringstream 运算符重载搜索顺序
- 查询std::ostringstream内容
- std::unique_ptr和std::ostringstream (SIGSEGV)的奇怪行为
- 实现一个可被接受为std::ostringstream引用的无操作std::ostringstream
- std::ostringstream作为函数参数的问题
- std::ostringstream to LPCSTR?
- Inherit from std::ostringstream
- 在不复制的情况下将std::ostringstream写入文件