Я использовал что-то вроде следующего для составления политик для моего приложения:
Классы политики выглядят так:
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 здесь.
Заранее спасибо.