Je l'ai utilisé quelque chose comme ce qui suit pour composer les politiques de mon application:Comment utiliser boost :: mpl pour composer des politiques?
Les classes politiques se présentent comme suit:
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();
}
//...
};
Pour composer les politiques:
typedef Cons<Policy1, Cons<Policy2, Cons<Policy3, Policy4> > > MyPolicy;
Pour utiliser MaStratégie:
init_with<MyPolicy>(...);
//...
cleanup_with<MyPolicy>(...);
où ils appelleraient:
MyPolicy::init_options(); // calls Policy1 to 4's init in order
et
MyPolicy::cleanup(); // calls Policy1 to 4's cleanup in reverse order
Essentiellement, Cons construit une liste de type ici. C'est plutôt simple. Cependant la ligne contre typedef est un peu moche. Ce sera idéal pour avoir combinateur de politique qui peut le faire:
typedef CombinePolicy<Policy1, Policy2, Policy3, Policy4> MyPolicy;
Puisque nous pouvons avoir un nombre arbitraire de politiques, le CombinePolicy aurait besoin d'un soutien de modèle variadique en C++ 0x, qui est uniquement disponible expérimentalement en coupe compilateurs de bord. Cependant, il semble que boost: bibliothèque mpl résolu/travaillé autour du problème en utilisant un tas de tours de prétraitement. Je suppose que je pourrais utiliser quelque chose comme:
typedef mpl::list<Policy, Policy2, Policy3, Policy4> Policies;
puis appelle:
init_with<Policies>(...);
qui utiliserait alors:
typedef iter_fold<Policies, begin<Policies>::type,
some_magic_lambda_expression>::type MyPolicy;
De toute évidence, j'ai un peu de mal à déterminer some_magic_lambda_expression ici. Je suis sûr que c'est assez trivial pour les experts mpl ici.
Merci d'avance.
Il y a un petit bug dans votre exemple. Cela pourrait faire travailler pour l'exemple. Je peux utiliser for_each pour chaque méthode. Mais ce que je préfère avoir une politique combinée qui peut être transmise, c'est-à-dire, je préfère que l'ordre soit appliqué au moment de la compilation plutôt qu'à l'exécution avec for_each. – ididak
Comme je le vois, vous pouvez seulement appeler des métafonctions au moment de la compilation, je ne vois aucun moyen d'appeler init_options() ou toute autre fonction simple au moment de la compilation. J'ai compris que vous voulez appliquer automagiquement toutes les politiques de la liste des politiques en appelant init_with à l'exécution, ce que for_each fait. clarifier – tabdamage
Le but est de composer une classe de politique au moment de la compilation avec l'ordre appliqué comme dans mon exemple original et les méthodes réellement sont invoquées à l'exécution comme MyCombinedPolicy :: init_options() etc – ididak