2011-12-13 11 views

risposta

2

Non direttamente possibile con typedef; ovunque si utilizza un typedef, è equivalente per il tipo di originale, quindi se si scrive

typedef boost::function<void(A)> B; 
typedef boost::function<void(B)> A; 

allora B sarebbe equivalente a boost::function<void(A)>, che equivale a boost::function<void(boost::function<void(B)>)>, e così via, fino ad arrivare

boost::function<void(boost::function<void(boost::function<void(...)>)>)> 

, che è un tipo di lunghezza infinita.

È possibile, tuttavia, definire (almeno) uno dei due tipi come struct o class:

struct A; 
typedef boost::function<void(A)> B; 
struct A 
{ 
    B b; 
    A(B b) : b(b) {} 

    // optional: 
    void operator() (A a) { b(a); } 
}; 

Potrebbe essere necessario aggiungere più costruttori e/o un operatore di conversione per fare il tipo di comportarsi completamente "trasparente", oppure si può semplicemente accedere alla struttura in modo esplicito.

0

Avete considerato utilizzando puntatori a funzione ?

#include <iostream> 

    // void (*functionPtr)() <- declaration of function pointer 
void f(void (*functionPtr)()) { 
    // execute the function that functionPtr points to 
    (*functionPtr)(); 
} 

void a() { 
    std::cout << "Function a()" << std::endl; 
} 

int main() { 
    f(a); 
} 

Ho fatto questo codice di esempio e funziona. Forse potresti usarlo.

3

La tua domanda non è tecnicamente precisa. Una firma non è qualcosa che passi come argomento. Faccio del mio meglio per dare un senso alla tua domanda.

i seguenti oggetti di funzione possono essere passati come argomento gli uni agli altri

struct foo { 
    template<typename T> void operator()(T); 
}; 

struct bar { 
    template<typename T> void operator()(T); 
}; 

foo f; bar b; 
0

sono riuscito a realizzare quello che hai descritto passando queste funzioni l'uno all'altro proprio come void*. Forse non è il modo più bello, ma funziona (l'ho provato).

typedef void (*A)(void*); 
typedef void (*B)(void*); 

void afun(void* _bf) { 
    B _bfun = (B)_bf; 
    _bfun((void*)afun); 
} 

void bfun(void* _af) { 
    A _afun = (A)_af; 
    f(boost::bind(_afun, (void*)bfun)); 
} 

int main(int argc, char** argv) { 
    f(boost::bind(afun, (void*)bfun)); 
    return 0; 
} 
Problemi correlati