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

546   2  

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

    Ничего не найдено.