Pregunta

Tengo un conjunto de clases de devolución de llamada que uso para manejar devoluciones de llamada con números variables de parámetros. En este momento tengo alrededor de 6 instancias diferentes para manejar diferentes números de argumentos. ¿Hay una manera de crear una instancia que pueda manejar un número variable de argumentos? En última instancia, me encantaría que cada parámetro sea un tipo POD o un puntero de clase o un puntero de estructura. ¿Alguna idea?

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);
};
¿Fue útil?

Solución

Aún no está en el lenguaje en sí, pero C ++ 0x tendrá soporte para Plantillas variadas .

Otros consejos

Las plantillas variadas C ++ 0x es su mejor apuesta, pero también pasará un tiempo antes de que pueda usarlas.

Si necesita secuencias de tipos hoy, consulte MPL vector de tipos, así como otros tipos de secuencia de tipos. 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.

¿Qué hay de evitar este problema mediante el uso de Boost Bind ? Podría hacer que su código acepte un solo argumento, o ninguno, y vincular los argumentos que necesita en el sitio de la llamada.

Mi primera opción sería usar boost :: bind, boost :: function, o std :: bind / std :: function y / o c ++ 11 lambda para lograr tu objetivo. Pero si necesita rodar su propio functor, entonces usaría boost fusion para crear un 'funtor 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 utilizan macros de preprocesador para enumerar todas las opciones posibles para evitar la falta de plantillas varidic.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top