Это продолжение этого вопроса.
По сути, я хочу контейнер, который хранит объекты, а затем что-то с ними делает. Я хочу поместить в классы политики как действие, выполняемое над объектами (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
.
Как бы вы решили это? Какой шаблон я пропускаю?