Вы можете использовать рекурсивные шаблоны для составления списка политик, к которым все применяются, например:
#include <iostream>
template <typename Policy, typename Next=void>
struct policy_list {
static void apply() {
Policy::implement();
Next::apply();
}
};
template <typename Policy>
struct policy_list<Policy, void> {
static void apply() {
Policy::implement();
}
};
struct first_policy {
static void implement() { std::cout << "Policy 1" << std::endl; }
};
struct second_policy {
static void implement() { std::cout << "Policy 2" << std::endl; }
};
int main() {
typedef policy_list<first_policy, policy_list<second_policy> > policy;
while (1) {
policy::apply();
}
}
Для трех политик вам необходимо изменить typedef
на:
typedef policy_list<first_policy, policy_list<second_policy, policy_list<third_policy> > > policy;
Тогда все, что вам нужно сделать, это создать правильный список политик во время компиляции. Это может быть сделано внешней частью вашей системы сборки, которая генерирует файл заголовка с typedef
, или это может быть сделано либо с помощью препроцессора, либо с помощью магии шаблона, в зависимости от того, что именно определяет ваши политики.
Если у вас есть C ++ 11, вы можете несколько упростить policy_list
, используя шаблоны с переменными числами.