我可以使用std :: copy复制到stringstream中

时间:2018-06-01 11:40:36

标签: c++ stl

我最近遇到过这种情况,我希望将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 ++在实例化back_inserter时抱怨value_type中没有名为basic_stringstream的类型。

我可以std::copy进入stringstream对象吗?我该怎么做呢?请注意,上面是一个简单的例子,我不愿放弃流式语义,因为它们在真实环境中非常整洁。

2 个答案:

答案 0 :(得分:3)

您可以使用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将值打印为有符号整数,并使用一个空格作为分隔符。你可以根据你想要达到的目标选择别的东西。

使用std::back_inserter不适用于流,因为它的目的是对容器进行操作。它创建std::back_inserter_iterator,在传递的容器上调用push_back成员函数。它还假设Container有成员类型value_typeconst_reference和其他人(您检查它们的使用方式here)。

这里有一个示例:std::back_inserter返回的迭代器的operator=定义如下:

back_insert_iterator<Container> &operator=(typename Container::value_type &&value);

因为std::stringstream未定义value_type,编译失败。

答案 1 :(得分:0)

您无需使用std::copy()或任何其他算法。您可以使用流自己的write()方法,例如:

uint64_t val = 1984;
std::stringstream sstr;
sstr << "the byte value is ";
sstr.write(reinterpret_cast<char*>(&val), sizeof(val));