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

Spa*_*ose 4 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)));
Run Code Online (Sandbox Code Playgroud)

而鲍勃是你的叔叔。但我需要用 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));
Run Code Online (Sandbox Code Playgroud)

但是 g++ 在实例化 a 时抱怨back_inserter没有value_type在 a 中命名的类型basic_stringstream

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

Sta*_*irl 5

您可以使用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, " "));
Run Code Online (Sandbox Code Playgroud)

不过,您需要决定使用哪种类型。我使用int将值打印为有符号整数并使用一个空格作为分隔符。您可以根据您想要实现的目标选择其他内容。

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

下面一个例子:迭代器返回的std::back_inserter已经operator=是这样定义的:

back_insert_iterator<Container> &operator=(typename Container::value_type &&value);
Run Code Online (Sandbox Code Playgroud)

所以因为std::stringstream没有定义value_type,编译失败。