Existe uma maneira de lidar com um número variável de parâmetros em uma classe de modelo?

StackOverflow https://stackoverflow.com/questions/154780

Pergunta

Eu tenho um conjunto de classes de retorno de chamada que eu uso para lidar com retornos de chamada com números variáveis ??de parâmetros. Agora eu tenho cerca de 6 diferentes instâncias do mesmo para lidar com diferentes números de argumentos. Existe uma maneira de fazer uma instância que pode lidar com um número variável de argumentos ?? Em última análise, eu adoraria ter cada parâmetro ser um tipo POD ou um ponteiro de classe, ou um ponteiro struct. Alguma idéia?

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

Solução

Ainda não na língua em si, mas C ++ 0x terá suporte para variádica modelos .

Outras dicas

C ++ 0x modelos variatdic é a sua melhor aposta, mas também vai ser um pouco antes que você possa usá-los.

Se precisar de sequências de tipos de hoje, dê uma olhada do MPL vector de tipos, bem como outros tipos de sequências tipo. É parte do biblioteca Boost. Ele permite que você fornecer um argumento modelo que é uma sequência de tipos, em vez de apenas um único tipo.

Como sobre evitando este problema através do uso de impulsionar Bind ? Você poderia fazer o seu código de aceitar um único argumento, ou mesmo nenhum, e se ligam argumentos que você precisa no site da chamada.

A minha primeira escolha seria usar boost :: bind, boost :: função, ou std :: bind / std :: função e / ou c ++ 11 lambda de atingir o seu objetivo. Mas se você precisa rolar o seu próprio functor então eu iria usar o aumento de fusão para criar uma 'functor fundido' que recebe um único argumento de modelo.

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

Em última análise, todas estas bibliotecas usam macros pré-processador para enumerar todas as opções possíveis para contornar a falta de modelos varidic.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top