użyłem czegoś takiego do komponowania polityk dla mojej aplikacji:Jak używać boost :: mpl do komponowania zasad?
Klasy polityki wyglądać następująco:
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();
}
//...
};
Aby skomponować polityk:
typedef Cons<Policy1, Cons<Policy2, Cons<Policy3, Policy4> > > MyPolicy;
Aby korzystać MyPolicy:
init_with<MyPolicy>(...);
//...
cleanup_with<MyPolicy>(...);
gdzie mieliby zadzwonić:
MyPolicy::init_options(); // calls Policy1 to 4's init in order
i
MyPolicy::cleanup(); // calls Policy1 to 4's cleanup in reverse order
Zasadniczo Wady konstruuje listę wpisz tutaj. To całkiem proste. Jednak linia przeciwna jest trochę brzydka. To będzie idealny mieć politykę sumator, który może to zrobić:
typedef CombinePolicy<Policy1, Policy2, Policy3, Policy4> MyPolicy;
Ponieważ możemy mieć dowolną liczbę polityk, CombinePolicy musiałby o zmiennej liczbie argumentów pomocy szablonu w C++ 0x, który jest dostępny tylko eksperymentalnie cięcia kompilatory krawędzi. Wydaje się jednak, że boost: biblioteka mpl rozwiązała/rozwiązała problem za pomocą sztuczek preprocessingu grupowego. Chyba mogę używać coś takiego:
typedef mpl::list<Policy, Policy2, Policy3, Policy4> Policies;
a następnie wywołuje:
init_with<Policies>(...);
które następnie użyć:
typedef iter_fold<Policies, begin<Policies>::type,
some_magic_lambda_expression>::type MyPolicy;
Oczywiście, mam mały problem ze zorientowaniem się some_magic_lambda_expression tutaj. Jestem pewien, że dla ekspertów od mpl jest to dość trywialne.
Z góry dziękuję.
Jest trochę błędów w twój przykład. Może to zadziałać na przykład. Mogę użyć for_each dla każdej metody. Ale wolę mieć jedną wspólną politykę, którą można ominąć, tj. Wolę, aby kolejność była egzekwowana w czasie kompilacji, a nie w czasie wykonywania z for_each. – ididak
Jak widzę, można wywoływać metafunkcje tylko podczas kompilacji, nie widzę możliwości wywołania init_options() lub innej prostej funkcji podczas kompilacji. Rozumiem, że chcesz automagicznie zastosować wszystkie zasady na liście zasad, wywołując init_with w czasie wykonywania, co robi for_each. proszę wyjaśnić – tabdamage
Celem jest skomponowanie klasy polityki w czasie kompilacji z zamówieniem wymuszonym jak w moim oryginalnym przykładzie, a faktycznie metody są faktycznie wywoływane w czasie wykonywania, jak MyCombinedPolicy :: init_options() itp. – ididak