я использовал что-то вроде следующего, чтобы составить политику для моего приложения:Как использовать boost :: mpl для составления политик?
Классы политики выглядеть следующим образом:
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 cons выглядит некрасиво. Это будет идеально иметь политики сумматор, который может сделать это:
typedef CombinePolicy<Policy1, Policy2, Policy3, Policy4> MyPolicy;
Поскольку мы можем иметь произвольное число политики, CombinePolicy потребуется VARIADIC поддержка шаблонов в 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.
Заранее спасибо.
Там есть немного ошибки в ваш пример. Это может сделать работу для примера. Я могу использовать for_each для каждого метода. Но я предпочитаю иметь одну комбинированную политику, которая может быть передана, т. Е. Я предпочитаю, чтобы порядок выполнялся во время компиляции, а не во время выполнения с помощью for_each. – ididak 2008-11-02 17:26:08
Как я вижу, вы можете вызывать только метафайлы во время компиляции, я не вижу способа вызова init_options() или любой другой простой функции во время компиляции. Я понял, что вы хотите автоматическое применение всех политик в списке Policy, вызывая init_with во время выполнения, что и делает for_each. пожалуйста, уточните – tabdamage 2008-11-02 17:32:41
Цель состоит в том, чтобы составить класс политики во время компиляции с порядком, установленным в моем первоначальном примере, и фактически методы действительно вызывается во время выполнения, например MyCombinedPolicy :: init_options() и т. д. – ididak 2008-11-02 17:39:09