c++ - 我可以使用 std::copy 复制到 stringstream 吗
问题描述
我最近有一个案例,我想将一个int64_t
值的原始字节放入一个字符串流中。在 C++17 中,我可以执行以下操作:
uint64_t val = 1984;
std::stringstream sstr;
sstr << "the byte value is " << std::string_view(reinterpret_cast<char*>(&val), sizeof(decltype(val)));
鲍勃是你的叔叔。但我需要用 C++98 或 C++11 来做。我想做到以下几点:
std::copy(reinterpret_cast<const char*>(&tmp_time),
reinterpret_cast<const char*>(&tmp_time) + sizeof tmp_time,
std::back_inserter(sstr));
但是 g++ 在实例化时抱怨aback_inserter
中没有命名类型。value_type
basic_stringstream
我不能std::copy
变成一个stringstream
对象吗?我该怎么做呢?请注意,上面是一个简单的示例,我不愿意放弃流语义,因为它们在真实上下文中非常整洁。
解决方案
您可以使用std::ostream_iterator
.
std::stringstream ss;
std::copy(reinterpret_cast<const char*>(&tmp_time),
reinterpret_cast<const char*>(&tmp_time) + sizeof tmp_time,
std::ostream_iterator<int>(ss, " "));
不过,您需要决定使用什么类型。我使用int
将值打印为有符号整数并使用一个空格作为分隔符。你可以根据你想要达到的目标选择其他东西。
Usingstd::back_inserter
不适用于流,因为它的目的是对容器进行操作。它在传递的容器上创建std::back_inserter_iterator
调用成员函数。push_back
它还假设Container
具有成员类型value_type
和其他类型(您可以在此处const_reference
查看它们的使用方式)。
这里有一个例子:返回的迭代器std::back_inserter
定义operator=
如下:
back_insert_iterator<Container> &operator=(typename Container::value_type &&value);
所以因为std::stringstream
没有定义value_type
,编译失败。
推荐阅读
- c++ - 为什么 C++ 'int arr[n];' 这样 n 是变量在一种环境中工作而在另一种环境中不起作用?
- python - 将行数据从一个数据框排列到另一个数据框
- windows-store-apps - 修复了通过 Microsoft Store 安装 Windows 混合现实门户导致“出错”错误
- android - 为什么在运行时在 pubspec.yaml 中添加 firebase_admob: ^0.11.0+1 会产生错误(Flutter,Android)
- django - Django Rest Framework 如何过滤嵌套数据?
- java - Micronaut 需要异步编程吗?
- python - Python imshow 未显示更改
- apache-kafka - 在 docker 上为 kafka 暴露端口 8083 会出错
- maven - 有没有办法修复 Ambari Web 2.7.1.0.0 构建问题?
- php - Ajax表单提交我想通过id更改表单元素的值,以便脚本从php中的返回值进行下一次调用