ich so etwas wie die folgenden Richtlinien für meine Anwendung zu komponieren verwendet haben:Wie boost :: mpl zum Verfassen von Richtlinien verwendet werden kann?
Die Policy-Klassen wie folgt aussehen:
typedef Cons<Policy1, Cons<Policy2, Cons<Policy3, Policy4> > > MyPolicy;
Um MyPolicy zu verwenden:
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();
}
//...
};
Politik zu komponieren
init_with<MyPolicy>(...);
//...
cleanup_with<MyPolicy>(...);
wo würden sie anrufen:
MyPolicy::init_options(); // calls Policy1 to 4's init in order
und
MyPolicy::cleanup(); // calls Policy1 to 4's cleanup in reverse order
wesentlichen Nachteile konstruiert eine Art Liste hier. Es ist ziemlich geradlinig. Die typedef con-Linie ist jedoch irgendwie hässlich. Es wird ideal seine Politik Kombinierer hat, kann dies tun:
typedef CombinePolicy<Policy1, Policy2, Policy3, Policy4> MyPolicy;
Da wir beliebige Anzahl von Politik haben können, die CombinePolicy variadische Template-Unterstützung in C++ 0x brauchen würde, die experimentell nur verfügbar ist, beim Schneiden Edge-Compiler. Es scheint jedoch, dass boost: mpl library das Problem gelöst und bearbeitet hat, indem eine Reihe von Vorverarbeitungstricks verwendet wurde. Ich ich denke, so etwas wie verwenden:
typedef mpl::list<Policy, Policy2, Policy3, Policy4> Policies;
und ruft dann:
init_with<Policies>(...);
die dann verwenden würde:
typedef iter_fold<Policies, begin<Policies>::type,
some_magic_lambda_expression>::type MyPolicy;
Natürlich, ich habe ein wenig Mühe, herauszufinden, some_magic_lambda_expression hier. Ich bin mir sicher, dass es für MLP-Experten hier ziemlich trivial ist.
Vielen Dank im Voraus.
Es gibt einen kleinen Fehler in Ihr Beispiel. Dies könnte dazu führen, dass das Beispiel funktioniert. Ich kann for_each für jede Methode verwenden. Aber was ich bevorzuge, um eine kombinierte Politik zu haben, die herumgereicht werden kann, dh, bevorzuge ich die Reihenfolge, die zur Kompilierungszeit erzwungen wird, anstatt zur Laufzeit mit for_each. – ididak
Wie ich es sehe, können Sie Metafunktionen nur zur Kompilierzeit aufrufen, ich sehe keine Möglichkeit, init_options() oder irgendeine andere einfache Funktion zur Kompilierzeit aufzurufen. Ich habe verstanden, dass Sie alle Richtlinien in der Richtlinienliste automatisch anwenden möchten, indem Sie init_with zur Laufzeit aufrufen, was for_each auch tut. Bitte klären Sie – tabdamage
Das Ziel ist es, eine Policy-Klasse zur Kompilierzeit mit der Reihenfolge wie in meinem ursprünglichen Beispiel erzwungen und die tatsächlichen Methoden sind in der Tat zur Laufzeit wie MyCombinedPolicy :: init_options() etc. aufgerufen. – ididak