Разработка политики C ++ с зависимостями - PullRequest
1 голос
/ 01 декабря 2011

Это продолжение этого вопроса.

По сути, я хочу контейнер, который хранит объекты, а затем что-то с ними делает. Я хочу поместить в классы политики как действие, выполняемое над объектами (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 голосов
/ 01 декабря 2011

Почему ActionPolicy нужно знать о StoragePolicy?

Почему к ActionPolicy добавляются объекты?

Если вы передаете ActionPolicy в StoragePolicy в качестве аргумента execute, а затем вызвать eval для отдельного элемента или коллекции, разве это не решит это для вас?

...