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, которая позволяет ссылаться на объекты через их ключ и создавать их только в том случае, если они еще не представлены в магазине.

Другие вопросы по тегам