могу ли я использовать 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++ жалуется при создании экземпляра back_inserter, что в basic_stringstream Нет типа с именем value_type.
Не могу ли я std::copy в Объект stringstream? Как мне это сделать? Примечание выше приведен упрощенный пример, и я не хочу отказываться от потоковой семантики, поскольку они очень аккуратны в реальном контексте.
2 ответов:
Вы можете использовать
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и другие (вы проверяете, как они используются здесь).Вот пример: итератор, возвращаемый
std::back_inserter, имеетoperator=, определенный следующим образом:back_insert_iterator<Container> &operator=(typename Container::value_type &&value);Поэтому, поскольку
std::stringstreamне определеноvalue_type, компиляция завершается неудачей.
Вам не нужно использовать
std::copy()или какой-либо другой алгоритм. Вы можете использовать собственный потокwrite()метод вместо этого, например:uint64_t val = 1984; std::stringstream sstr; sstr << "the byte value is "; sstr.write(reinterpret_cast<char*>(&val), sizeof(val));
Comments