2011-01-30 1 views
1

Quand nous faisonsComment faire typedef sur la fonction void qui pourrait appartenir à n'importe quelle classe?

typedef void FuncCharPtr(char*, int) ; 
vector<FuncCharPtr*> FuncVec ; 
void Add(FuncCharPtr* f) 
{ 
    FuncVec.push_back(f); 
} 

nous ne permettons pas de passer comme types FuncCharPtr comme

void (someClass::*)b(char*, int); 
void (someOtherClass::*)b(char*, int); 

et nous voulons garder des liens vers des fonctions des deux classes dans un même vecteur afin de pouvoir appeler tous abonnés à la fois AVEC QUELQUE CHOSE COMME

void CastData(char * data, int length){ 
    for(size_t i = 0 ; i < FuncVec.size(); i++){ 
     char* dataCopy = new char[length]; 
     memcpy(dataCopy, data, length); 
     FuncVec[i](dataCopy, length); 
        delete[] dataCopy; 
    } 
} 

Comment résoudre ce type de problème?

Répondre

6

Vous ne pouvez pas utiliser un pointeur de fonction pour cela. Le type de classe est une partie du type d'un pointeur vers une fonction membre, donc il n'y a pas un seul type qui fonctionnerait.

La meilleure façon d'accomplir ce que vous voulez faire est d'utiliser the function class et the bind function de Boost, C++ TR1, ou C++ 0x.

Vous pouvez maintenir une std::vector<std::function<void(char*, int)> > et utiliser la fonction bind pour lier des pointeurs vers des fonctions membres à l'instance de la classe sur laquelle vous voulez que la fonction membre à appeler:

struct A { void foo(int) { } }; 
struct B { void bar(int) { } }; 

typedef std::function<void(int)> Function; 
typedef std::vector<Function>  FunctionSequence; 
typedef FunctionSequence::iterator FunctionIterator; 

FunctionSequence funcs; 

A a; 
B b; 

funcs.push_back(std::bind(&A::foo, &a, std::placeholders::_1)); 
funcs.push_back(std::bind(&B::bar, &b, std::placeholders::_1)); 

// this calls a.foo(42) then b.bar(42): 
for (FunctionIterator it(funcs.begin()); it != funcs.end(); ++it) 
    (*it)(42); 
+0

Pouvez-vous fournir des liens ou le code des exemples sur la façon d'implémenter std :: vector > solution? Ce serait vraiment râleur! – Rella

+0

@Kabumbus: Cela ressemblerait à ce que j'ai montré dans l'exemple ici. Vos types d'arguments diffèrent selon les types réels des fonctions. –

+0

J'ai aimé votre classe ... et en quelque sorte mis à jour ... et a obtenu l'erreur décrite ici http://stackoverflow.com/questions/4853263/why-so-many-errors-here-in-typedef – Rella

Questions connexes