c++ - 使用 Boost 和外部数据源的享元

标签 c++ boost flyweight-pattern boost-flyweight

也许有一种我没有看到的解决此问题的简单方法,所以希望有人能向我解释一下。

假设我有一个类:

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 对象,因为它们可能有数百万个引用,实际上它们包含大量数据.它们将在 namefileName 上一起散列。

我需要什么来完成这项工作?我需要 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/

相关文章:

c++ - 尽管使用了 fpic,但出现错误 "can not be used when making a shared object; recompile with -fPIC"

c++ - WIndow 10 中的类型转换问题(WinAPI 中的 DWORD 和 ULONG_PTR)

java - 享元设计模式如何维护不同的对象?

java - Java 如何在幕后为字符串实现享元模式?

c++ - 享元模式和 C++ 模板

c++ - Swig、Python、C++ : TypeError: in method 'Geodatabase_Open' , 类型 'std::string' 的参数 2

C++ : Implicit type conversion

boost - scoped_lock 对文件不起作用?

c++ - boost 属性树放置/获取 DBL_MAX

c++ - 如何将 boost::asio::tcp::io_stream 附加到我的 io_service?