he usado algo como lo siguiente para componer las políticas de mi solicitud:¿Cómo usar boost :: mpl para redactar políticas?
Las clases de política tener este aspecto:
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();
}
//...
};
Para componer políticas:
typedef Cons<Policy1, Cons<Policy2, Cons<Policy3, Policy4> > > MyPolicy;
Para utilizar MyPolicy:
init_with<MyPolicy>(...);
//...
cleanup_with<MyPolicy>(...);
donde llamarían:
MyPolicy::init_options(); // calls Policy1 to 4's init in order
y
MyPolicy::cleanup(); // calls Policy1 to 4's cleanup in reverse order
Esencialmente, Contras construye una lista de tipos aquí. Es bastante sencillo. Sin embargo, la línea de contras typedef es un poco fea. Que va a ser ideal para tener combinador política que puede hacer esto:
typedef CombinePolicy<Policy1, Policy2, Policy3, Policy4> MyPolicy;
Ya que podemos tener un número arbitrario de las políticas, la CombinePolicy necesitaría ayuda de la plantilla variadic en C++ 0x, que sólo está disponible de forma experimental en el corte compiladores de borde. Sin embargo, parece que la biblioteca boost: mpl resolvió/resolvió el problema utilizando un montón de trucos de preprocesamiento. Me supongo que podría utilizar algo como:
typedef mpl::list<Policy, Policy2, Policy3, Policy4> Policies;
y luego llama:
init_with<Policies>(...);
que luego utilizar:
typedef iter_fold<Policies, begin<Policies>::type,
some_magic_lambda_expression>::type MyPolicy;
Obviamente, tengo un poco de problemas para encontrar la some_magic_lambda_expression aquí. Estoy seguro de que es bastante trivial para los expertos MPL aquí.
Gracias de antemano.
Hay un pequeño error en tu ejemplo Esto podría hacer que funcione para el ejemplo. Puedo usar for_each para cada método. Pero lo que prefiero es tener una política combinada que se pueda transmitir, es decir, prefiero que la orden se aplique en tiempo de compilación en lugar de en tiempo de ejecución con for_each. – ididak
Tal como lo veo, solo puede llamar metafunciones en tiempo de compilación, no veo forma de llamar a init_options() o cualquier otra función simple en tiempo de compilación. Entendí que desea aplicar automágicamente todas las Políticas en la lista de Políticas llamando a init_with en el tiempo de ejecución, que es lo que for_echo hace. aclare – tabdamage
El objetivo es componer una clase de política en tiempo de compilación con la orden aplicada como en mi ejemplo original y los métodos realmente se invocan en tiempo de ejecución como MyCombinedPolicy :: init_options() etc. – ididak