Возможно, есть простой способ обойти это, который я не вижу, так что надеюсь, кто-нибудь сможет мне его объяснить.
Допустим, у меня есть класс:
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
стать полноценной фабрикой и использоваться как пользовательская фабрика? Или можно использовать фабрику по умолчанию в flyweight и как-то использовать AReader
для генерации экземпляров A
(в отличие от реализации всего паттерна хранения, требуемого фабрикой), может быть, сделав экземпляр AReader
аргументом для чего-то в flyweight? Или возможно ли получить const
публичные переменные (т.е. после установки они не меняются) из внешнего источника данных, не прибегая к помощи второго класса?
Edit
Я также открыт для других предложений, не использующих Boost. Я, конечно, могу написать свою собственную реализацию flyweight, или любого другого паттерна, если он лучше подходит. Но если я могу использовать что-то уже существующее, это было бы лучше. Все, что минимизирует количество кода, который мне нужно написать, потому что, как всегда, сроки сжатые.