Заполнение std :: vector необработанными данными - PullRequest
2 голосов
/ 24 апреля 2019

Мне нужно заполнить вектор необработанными данными, иногда 2 байта, иногда 8 ... Я закончил с этой функцией шаблона:

template <typename T>
void fillVector(std::vector<uint8_t>& dest, T t)
{
    auto ptr = reinterpret_cast<uint8_t*>(&t);
    dest.insert(dest.end(),ptr,ptr+sizeof(t));
}

этим я могу заполнить вектор следующим образом:

fillVector<uint32_t>(dst,32bitdata);
fillVector<uint16_t>(dst,16bitdata);

Мне было интересно, существует ли что-то более похожее в стандартной библиотеке?

1 Ответ

5 голосов
/ 24 апреля 2019

Нет, в стандартной библиотеке нет ничего, чтобы достичь того, чего вы хотите. Таким образом, ваше решение - это почти то, что вы можете использовать в настоящее время (при условии, что ваша цель - выполнить некоторую форму сериализации).

Единственное улучшение: вы предполагаете, что uint8_t - это тип, который можно использовать для псевдонима объекта и проверки его байтов. Это не должно быть так. Единственными такими типами в C ++ 11 являются char и unsigned char. Хотя uint8_t обычно псевдоним поздних в большинстве современных архитектур, это не является жестким требованием, он может псевдоним 8-разрядного целочисленного типа без знака для конкретной платформы (преимущества этого выходят за рамки этого вопроса). Поэтому, чтобы соответствовать стандарту, будьте осторожны:

static_assert(std::is_same<unsigned char, std::uint8_t>::value, "Oops!");

Или используйте свой собственный псевдоним для допустимого типа "байт"

namespace myapp { using byte = unsigned char; }

и сделка в std::vector<myapp::byte>.

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