Pregunta

Esto es lo que yo quiero ser capaz de escribir:

class foo : public watchKeys<A, B, C> {}; //Or any list of keys

Boost :: MPL tiene secuencias, que le permiten hacer esto, pero yo no quiero tener que hacer:

class foo : public watchKeys<mpl::list<A, B, C> > {};

no me importa que sea "feo" o detallado en el interior, pero desea que la forma watchKeys se utiliza en última instancia a ser muy simple e intuitiva. Asimismo, no puede encontrar la manera impulso lo está haciendo, pero eso parece ser porque hay una capa de macros entre mí y plantillas.

¿Cómo puede hacerlo? Yo prefiero no para hacer la lista gigante de plantillas para cada número de tipos, pero si esa es la única que es la única manera ...

Edit: me he vuelto bastante seguro de que no hay manera de hacer lo que quiero hacer (casi, pero no se puede tener un número variable de argumentos de la macro), pero la cuestión sigue generando respuestas útiles e informativos.

¿Fue útil?

Solución

El lista gigante de plantillas para cada número de tipos es la única manera de hacerlo en la versión actual de C ++. Ver impulso :: tupla para un ejemplo de cómo hacer.

C ++ 0X soportes variadic plantillas , pero que no está bien apoyado con todo (creo versión moderna de GCC tiene soporte experimental sin embargo).

Otros consejos

Como alternativa, puede hacerlo de forma recursiva

template<typename Head, typename Tail>
struct list { };

struct emptylist { };

class foo : public watchKeys<list<A, 
                             list<B, 
                             list<C, emptylist> > > > { };

A continuación, puede procesarlo como esto

template<typename List>
struct process;

template<typename Head, typename Tail>
struct process< list<Head, Tail> > : process<Tail> { 
  // process Head
};

template<>
struct process<emptylist> { };
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top