我最近遇到过这种情况,我希望将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
对象吗?我该怎么做呢?请注意,上面是一个简单的例子,我不愿放弃流式语义,因为它们在真实环境中非常整洁。
答案 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_type
,const_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));