7

也许有一个我没有看到的简单方法,所以希望有人可以向我解释。

假设我有一堂课:

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 的建议。我当然可以编写自己的轻量级实现,或者如果有更适合的任何其他模式。但是,如果我可以使用已经存在的东西,那将是最好的。无论什么都能最大限度地减少我需要编写的代码量,因为与往常一样,截止日期很短。

4

3 回答 3

1

我没有使用过 Boost::flyweight 但从它的外观来看,至少关键需要是Assignable(除了EqualityComparableand之外Hashable)。与你的const会员类型显然不是 Assignable你的。Assignable从外观上看,如果您有密钥提取器,则不必制作它。使用密钥提取器只需要密钥Assignable

于 2012-01-13T23:47:34.813 回答
0

虽然key_valueFlyweight 似乎符合要求,但似乎有一个小问题。您应该能够key_value仅使用键类型的一个参数 ( key_value flyweights ) 来构造享元。因此,要使其与您想要的密钥(文件名+名称)一起使用,您必须将这两个字段打包在一起(元组?甚至不确定这是否有效。)

假设您有兴趣以最少的工作获得最大的收益,为什么不只是像Flyweight BasicsFlyweight中演示的那样在您的课程中使用字符串?

这意味着A对象不会按照您想要的方式进行散列,但字符串很容易加权,这些似乎是您的内存问题字段。(除非这是过度简化)

于 2012-01-22T12:06:00.987 回答
0

在您的情况下使用享元的基本方法是让 readObject 返回一个享元。在内部,readObject 创建一个全新的对象,当您创建相应的享元对象时,它会检查该对象是否已经在享元存储中。如果是这样,它将删除您的新对象,并返回一个引用存储中对象的享元。如果没有,它将新对象添加到其池中。

现在,这应该很容易实现,但根据您的用例可能效率低下。为了获得更好的性能,您可以使用key_value功能,该功能允许您通过它们的键引用对象,并且仅在它们尚未存在于存储中时才创建它们。

于 2012-01-21T19:51:43.193 回答