也许有一种我没有看到的解决此问题的简单方法,所以希望有人能向我解释一下。
假设我有一个类:
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
公共(public)变量(即一旦设置,它们就不会改变)而不求助于第二个类?
编辑
我也乐于接受其他不使用 Boost 的建议。我当然可以编写自己的轻量级实现,或者任何其他更适合的模式。但是,如果我可以使用已经存在的东西,那将是最好的。无论什么都能最大限度地减少我需要编写的代码量,因为一如既往,截止日期很短。
最佳答案
我没有使用过 Boost::flyweight 但从它的外观来看,至少关键需要是 Assignable
(除了 EqualityComparable
和 可散列
)。对于您的 const
成员,您键入的显然不是 Assignable
。从外观上看,如果您有 key 提取器,则不必将其设置为Assignable
。使用 key 提取器,只有 key 需要是 Assignable
。
关于c++ - 使用 Boost 和外部数据源的享元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8853999/