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.