带依赖关系的C ++策略设计

时间:2011-12-01 00:10:36

标签: c++ templates metaprogramming policies

这是this问题的后续问题。

基本上我想要一个存储对象的容器,然后用它们做一些事情。我想将对象(ActionPolicy)和存储(StoragePolicy)执行的操作都放入策略类中。最后,该课程应该有两个功能:

  • addObject()的签名取决于ActionPolicy,即应在此处定义此功能。
  • execute(),它遍历StoragePolicy存储的所有对象,并在所有对象上执行ActionPolicy::evaluate(obj)

在(部分伪)代码中(标有Here的地方是在本设计中不起作用的地方):

struct ActionPolicy {
  // Signature is dependant on this policy
  void addObject(T obj, /* ... */) {
    // Do something with the object
    StoragePolicy::store(obj); // <--- Here
  }

  void eval(T obj) {
    // Do something with the object
  }
};

struct StoragePolicySingle {
  T obj;

  void store(T obj) {
    this->obj = obj;
  }

  void execute() {
    ActionPolicy::execute(obj); // <--- Here
  }
};


struct StoragePolicyMulti {
  std::vector<T> vec;

  void store(T obj) {
    vec.push_back(obj´);
  }

  void execute() {
    for (obj in vec) {
      ActionPolicy::execute(obj); // <--- Here
    }
  }
};

template <class A, class B> MyClass : public A, public B {
  // ...
};

所有这些都是对性能至关重要的,所以我不能只使用带有一个条目而不是StoragePolicySingle的向量。

你会如何解决这个问题?我缺少任何模式?

1 个答案:

答案 0 :(得分:0)

为什么ActionPolicy需要了解StoragePolicy

为什么ActionPolicy会添加对象?

如果您将ActionPolicy作为StoragePolicy的参数传递给execute,请在单个项目或集合上调用eval,这是否解决不了问题为你?