Я использовал что-то вроде следующего для составления политик для своего приложения:
Классы политик выглядят следующим образом:
struct Policy {
static void init();
static void cleanup();
//...
};
template <class CarT, class CdrT>
struct Cons {
static void init() {
CarT::init();
CdrT::init();
}
static void cleanup() {
CdrT::cleanup();
CarT::cleanup();
}
//...
};
Чтобы составить политику:
typedef Cons<Policy1, Cons<Policy2, Cons<Policy3, Policy4> > > MyPolicy;
Чтобы использовать MyPolicy:
init_with<MyPolicy>(...);
//...
cleanup_with<MyPolicy>(...);
где они будут звонить:
MyPolicy::init_options(); // calls Policy1 to 4's init in order
и
MyPolicy::cleanup(); // calls Policy1 to 4's cleanup in reverse order
По сути, Cons создает здесь список типов. Это довольно прямолинейно. Однако строка минусов typedef довольно уродлива. Было бы идеально иметь объединитель политик, который может это сделать:
typedef CombinePolicy<Policy1, Policy2, Policy3, Policy4> MyPolicy;
Поскольку у нас может быть произвольное количество политик, CombinePolicy потребуется поддержка вариативных шаблонов в C++0x, которая доступна только экспериментально в передовых компиляторах. Однако похоже, что библиотека boost:mpl решила проблему, используя множество приемов предварительной обработки. Думаю, я мог бы использовать что-то вроде:
typedef mpl::list<Policy, Policy2, Policy3, Policy4> Policies;
а потом звонит:
init_with<Policies>(...);
который затем будет использовать:
typedef iter_fold<Policies, begin<Policies>::type,
some_magic_lambda_expression>::type MyPolicy;
Очевидно, у меня возникли небольшие проблемы с определением здесь some_magic_lambda_expression. Я уверен, что это довольно тривиально для экспертов по mpl здесь.
Заранее спасибо.