Използвал съм нещо като следното, за да съставя политики за моето приложение:
Класовете правила изглеждат така:
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 тук.
Благодаря предварително.