我最近遇到了一种情况,我想将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对象吗?我该怎么做?请注意,上面是一个简单的例子,我不愿意放弃流语义,因为它们在实际上下文中非常整洁。
您可以使用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_type,const_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,编译失败。