Я прошу об этом, потому что даже, похоже, это работает, я чувствую, что это не должно. Цель состоит в том, чтобы иметь коллекцию объектов, находящихся в живых, и общий доступ к ним. Это то, что я имею на данный момент:Является ли объект действительным в сериализованной форме? C++/наследование/сериализация
Сделайте доступ базового указателя:
struct base { virtual void tick() = 0; }; //ptr access
с различными типами, которые наследуют от него:
struct :public base
{
void tick() { cout << "im type 1" << endl; }
}type1;
struct :public base
{
void tick() { cout << "im type 2" << endl; }
}type2;
Тогда класс контейнера, который должен быть в состоянии хранить любое количество этих сериализованная:
class control
{
struct xtype //struct for organizing objects
{
vector<char>charbuf; //serialized object
}xtype_template;
vector<xtype>xtype_vec;
public:
template<typename T> base* tell_to(T &input) //take object, return (base*)
{
xtype_template.charbuf.resize(sizeof(input));
memcpy(xtype_template.charbuf.data(), (char*)&input, sizeof(input));
xtype_vec.push_back(xtype_template); //push back with template after filling
return (base*)xtype_vec[xtype_vec.size() - 1].charbuf.data(); //pointer to data
}
}xcontainer; //container object
Тогда звоните:
auto ptr = controller.tell_to(type1); //becomes base*
auto ptr2 = controller.tell_to(type2);
И вы можете получить доступ к любому статическому размерному сериализованному объекту, а также его состояния, выполнив:
ptr->tick(); //which will output "im type 1" to console
ptr2->tick() //"im type 2"
Но это законно? Имеют ли эти сериализованные версии фактический тип? Является ли доступ к сериализованному объекту напрямую с базовым указателем незаконным или неправильным?
Ближайший вероятный ответ: как возвращение на is_trivially_copyable показать ложные, объекты не могут быть безопасно управлять после получения базового наследования.
Последующий подход: этот подход, похоже, работает, и возиться с is_trivially_copyable
, кажется, предполагает, что создание объекта наследует методы, делает его небезопасным. Однако основные методы не делают его небезопасным, и это заставляет меня задаться вопросом, распространяется ли безопасность только на экспорт между системами, сохранение в файл или передачу по сети. Может быть, проверка просто предполагает, что виртуальная ссылка делает их небезопасными?
Последующие действия 2: Если символы остаются в одном и том же месте в памяти, имеет ли значение, как они доступны? Id заявляет, что единственная реальная проблема с этим подходом заключается в том, что если хранящиеся объекты должны иметь элементы, которые изменили бы их размер после их сохранения.
Я хочу иметь коллекцию различных объектов в векторе (векторов). Идея состоит в том, чтобы хранить объекты-объекты, которые указывают контейнеру, что должен делать tick(), или обобщать доступ к методам между типами, если это имеет смысл – Charlie
как вектор> objs_owner; ? hm Я не думаю, что я знаком с этим подходом. Он не будет обрезать объекты? –
Charlie
См. Мой ответ, мой оригинальный комментарий был неправильным. – SergeyA