2010-07-23 13 views
3

J'utilise boost (signals + bind) et C++ pour passer la référence de fonction. Voici le code:Problème de fonction de liaison

#define CONNECT(FunctionPointer) \ 
     connect(bind(FunctionPointer, this, _1)); 

J'utilise cela comme ceci:

class SomeClass { 
    void test1() {} 
    void test2(int someArg) {} 

    SomeClass() { 
    CONNECT(&SomeClass::test1); 
    CONNECT(&SomeClass::test2); 
    } 
}; 

fonction de test de liaison Second oeuvre (test2), parce qu'il a au moins un argument. Avec le premier test, j'ai une erreur:

‘void (SomeClass::*)()’ is not a class, struct, or union type 

Pourquoi je ne peux pas passer des fonctions sans arguments?

Répondre

4

_1 est un argument d'espace réservé qui signifie "substituer avec le premier argument d'entrée". La méthode test1 n'a pas d'arguments.

Créer deux macros différentes:

#define CONNECT1(FunctionPointer) connect(bind(FunctionPointer, this, _1)); 
#define CONNECT0(FunctionPointer) connect(bind(FunctionPointer, this)); 

Mais rappelez-vous macros are evil.

Et l'utiliser comme ceci:

class SomeClass { 
    void test1() {} 
    void test2(int someArg) {} 

    SomeClass() { 
    CONNECT1(&SomeClass::test1); 
    CONNECT0(&SomeClass::test2); 
    } 
}; 
+0

D'accord, j'udnerstand. Je sais que les macros sont mauvaises, mais le corps de mes macros est grand et laid. Bien sûr, si ce serait comme mon échantillon, je l'utiliserais. Merci. – Ockonal