я могу использовать std :: copy для копирования в stringstream - PullRequest
0 голосов
/ 01 июня 2018

Недавно у меня был случай, когда я хотел взять необработанные байты значения 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.1013 * в stringstream объект?Как мне это сделать?Обратите внимание, что приведенный выше пример является тривиальным, и я не хочу отказываться от семантики потоковой передачи, поскольку они очень аккуратны в реальном контексте.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вам не нужно использовать std::copy() или любой другой алгоритм.Вместо этого вы можете использовать собственный метод потока write(), например:

uint64_t val = 1984;
std::stringstream sstr;
sstr << "the byte value is ";
sstr.write(reinterpret_cast<char*>(&val), sizeof(val));
0 голосов
/ 01 июня 2018

Вы можете использовать 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, компиляция не удалась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...