Я пытаюсь повысить :: сериализует структуры, которые указывают на объекты (скажем, класса символов), реализующие идею одного экземпляра за уникальность - < что-то > , Это значит, что эти объекты создаются не напрямую, а с использованием символа статического метода :: get(). Этот метод извлекает существующий объект из некоторого глобального словаря или при необходимости создает новый объект.boost :: сериализация одного экземпляра на уникальный идентификатор
Теперь сложная часть заключается в том, что в моей системе у меня много больших структур с указателями на такие символы. В то же время структуры не подходят всем в памяти. Поэтому мне нужно последовательно строить, готовить и сериализовать каждую из структур отдельно. Позже я буду deserialize и обрабатывать структуры по запросу.
Стандартные методы boost :: serialize, а именно load (...) и save (...) здесь не работают. Наверху десериализация структуры потеряла бы общесистемную уникальность символов, и сериализация бы потратила много места (объекты моего символа довольно велики). Я прочитал документы повышения и обнаружил, что для нестандартных конструкторов я могу использовать функции save_construct_data и load_construct_data. Но, по словам документа, по умолчанию load_construct_data «просто использует конструктор по умолчанию для инициализации ранее выделенной памяти». Так снова это не так.
Вопрос в следующем: как я могу обойти эту функцию загрузки, чтобы я мог избежать выделения и использовать мой символ :: get() вместо этого? Или, может быть, есть более элегантное решение?
EDIT: прилагается простой код, демонстрирующий проблему.
struct structure_element {
};
class symbol : public structure_element {
symbol(string x);
map<string, symbol> known_symbols;
public:
static symbol *get(string x) {
if (known_symbols.find(x) != known.symbols.end()){
known_symbols[x] = symbol(x);
}
return &known_symbols[x];
}
}
class structure_node : public structure_element {
set<symbol *> some_attributes;
vector<structure_element *> children;
}
Я прикрепил образец. Спасибо, что указали «мухи», я не знал этого имени шаблона. Кратко посмотрите на boost :: flyweight показывает, что это более или менее то, что мне нужно, но мне нужно как-то поместить flyweight в мою иерархию классов (ранее я не упоминал об этом аспекте, извините). Я хотел бы услышать ваш подробный комментарий. –
bzaborow
@bzaborow и у вас есть – sehe