Как записать класс в std::vector

Есть:

class Token {
    public:
        // DON'T DISTURB THE ORDER!!!
        lu  dist;
        hu length;
        BYTE character;
        // DON'T DISTURB THE ORDER!!!
    };

И указатель на пустой вектор: std::vector<BYTE>* block, где BYTE - unsigned char

Вопрос: Как записать Token в block и обратно


Ответы (1 шт):

Автор решения: Teivaz

Поскольку Token является типом простой структуры данных, то объекты этого класса можно скопировать при помощи memcpy.

std::vector<BYTE>* block; // указывает на существующий вектор
Token token; // существующий объект

// Выделяем достаточно памяти чтобы поместить объект.
block->resize(sizeof(Token));

// Поскольку вектор изначально пустой мы можем писать в его начало.
std::memcpy(&block->at(0), &token, sizeof(Token));

А затем для чтения обратно можно опять использовать memcpy:

Token token2; // в него будет скопирован объект
std::memcpy(&token2, &block->at(0), sizeof(Token));

Пример можно посмотреть тут: http://cpp.sh/5xm7u


Но это решение имеет свои ограничения. Одно из самых больших - данные не переносимые. То есть на системах с другими размерами базовых типов и другим порядком байтов значения не будут теми же. Если цель - передача данных на другую систему, то стоит использовать системы сериализации. Например, protocol buffers, cereal или просто json.

→ Ссылка