2008-09-30 9 views
5

Tengo un conjunto de clases de devolución de llamada que utilizo para manejar devoluciones de llamada con números variables de parámetros. En este momento tengo aproximadamente 6 instancias diferentes para manejar diferentes números de argumentos. ¿Hay alguna manera de hacer una instancia que no pueda manejar una cantidad variable de argumentos? En última instancia, me encantaría que cada parámetro sea un tipo de POD o un puntero de clase, o un puntero de estructura. ¿Algunas ideas?¿Hay alguna forma de manejar una cantidad variable de parámetros en una clase de plantilla?

template <class T> 
class kGUICallBackPtr 
{ 
public: 
    kGUICallBackPtr() {m_obj=0;m_func=0;} 
    void Set(void *o,void (*f)(void *,T *)); 
    inline void Call(T *i) {if(m_func) m_func(m_obj,i);} 
    inline bool IsValid(void) {return (m_func!=0);} 
private: 
    void *m_obj; 
    void (*m_func)(void *,T *); 
}; 


template <class T,class U> 
class kGUICallBackPtrPtr 
{ 
public: 
    kGUICallBackPtrPtr() {m_obj=0;m_func=0;} 
    void Set(void *o,void (*f)(void *,T *,U *)); 
    inline void Call(T *i, U *j) {if(m_func) m_func(m_obj,i,j);} 
    inline bool IsValid(void) {return (m_func!=0);} 
private: 
    void *m_obj; 
    void (*m_func)(void *,T *,U *j); 
}; 

Respuesta

0

¿Qué hay de eludir este problema mediante el uso de Boost Bind? Puede hacer que su código acepte un único argumento, o ninguno, y enlazar los argumentos que necesita en el sitio de llamadas.

3

C++ 0x Las plantillas variadas son su mejor opción, pero también pasará un tiempo hasta que pueda usarlas.

Si necesita secuencias de tipos hoy, eche un vistazo a los tipos vector de MPL, así como a otros tipos de secuencia de tipo. Es parte de la biblioteca Boost. Le permite proporcionar un argumento de plantilla que es una secuencia de tipos, en lugar de un solo tipo.

0

Mi primera opción sería usar boost :: bind, boost :: function, o std :: bind/std :: function y/o C++ 11 lambda para lograr su objetivo. Pero si necesita desplegar su propio functor, usaría boost fusion para crear un "functor fusionado" que tome un solo argumento de plantilla.

http://www.boost.org/doc/libs/1_41_0/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused.html

En última instancia todas estas bibliotecas usar macros pre-procesador para enumerar todas las opciones posibles para evitar la falta de plantillas varidic.

Cuestiones relacionadas