首页 > 解决方案 > 我可以使用 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_typebasic_stringstream

我不能std::copy变成一个stringstream对象吗?我该怎么做呢?请注意,上面是一个简单的示例,我不愿意放弃流语义,因为它们在真实上下文中非常整洁。

标签: c++stl

解决方案


您可以使用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,编译失败。


推荐阅读