Flyweights с Boost и внешними источниками данных
Может быть, есть простой способ обойти это, что я не вижу, так что, надеюсь, кто-нибудь сможет мне это объяснить.
Допустим, у меня есть класс:
class A {
public:
const double parameter;
const std::string name;
const std:: string fileName;
A(const double parameter, const std::string name, const std::string fileName) :
parameter(parameter), name(name), fileName(fileName) {};
};
И генератор для этого класса:
class AReader {
public:
ifstream dataFile;
AReader(const std::string filename);
A* readObject(const std::string objectName);
};
Я хотел бы использовать boost::flyweight
справиться с этим A
объекты, потому что на них могут быть миллионы ссылок, и в действительности они содержат много данных. Они будут хешироваться на name
а также fileName
все вместе.
Что мне нужно, чтобы сделать эту работу? мне нужно boost::flyweight
звонить AReader.readObject
и хэш / сохранить полученный A
учебный класс.
Ли AReader
Нужно стать полноценным заводом и использовать его как заказной завод? Или можно использовать фабрику по умолчанию в навесном весе и как-то использовать AReader
генерировать A
экземпляры (в отличие от реализации всей схемы хранения, требуемой фабрикой), возможно, путем создания AReader
инстанс аргумент к чему то в налету? Или можно получить const
публичные переменные (т. е. однажды установленные, они не меняются) из внешнего источника данных, не прибегая к второму классу?
редактировать
Я также открыт для других предложений, не использующих Boost. Я, конечно, могу написать свою собственную реализацию навесного веса или любой другой шаблон, если он лучше подходит. Но если бы я мог использовать то, что уже существует, это было бы лучше всего. Что бы ни сводило к минимуму объем кода, который мне нужно написать, потому что, как всегда, сроки являются короткими.
3 ответа
Я не использовал Boost::flyweight, но, судя по всему, ключ должен быть Assignable
(в дополнение к тому, EqualityComparable
а также Hashable
). С вашим const
Члены, которые вы вводите, явно не Assignable
, Судя по всему, вам не нужно это делать Assignable
если у вас есть ключевой экстрактор. При использовании экстрактора ключей требуется только ключ Assignable
,
Хотя key_value
Мухи, кажется, отвечают всем требованиям, казалось бы, есть небольшая заминка. Вы должны быть в состоянии построить key_value
Flyweight, используя только один параметр типа ключа ( key_value flyweights). Таким образом, чтобы заставить его работать с нужным ключом (имя файла + имя), вам нужно упаковать эти 2 поля в одно ( кортеж? Даже не уверен, что это сработает).
Предполагая, что вы заинтересованы в получении максимальной отдачи при минимальном объеме работы, почему бы не просто Flyweight
строки в вашем классе, как показано в Основах Flyweight?
Это означает A
объекты хэшируются не так, как вы хотите, но строки легко взвешиваются, и это, кажется, ваши проблемные поля памяти. (если это не упрощение)
Основной способ использования веса в вашем случае для readObject, чтобы вернуть вес. Внутри readObject создает совершенно новый объект, и когда вы создаете соответствующий объект с наименьшим весом, он затем проверяет, находится ли объект уже в хранилище с наименьшим весом. Если это так, он уронит ваш новый объект и вернет наименьший вес, ссылающийся на объект в магазине. Если нет, он добавляет новый объект в свой пул.
Теперь это должно быть тривиально для реализации, но в зависимости от вашего варианта использования может быть неэффективным. Для лучшей производительности вы можете использовать функциональность key_value, которая позволяет ссылаться на объекты через их ключ и создавать их только в том случае, если они еще не представлены в магазине.