Не возможно напрямую с typedefs;где бы ни использовался typedef, он эквивалентен исходному типу, поэтому если вы напишите
typedef boost::function<void(A)> B;
typedef boost::function<void(B)> A;
, тогда B
будет эквивалентно boost::function<void(A)>
, что эквивалентно boost::function<void(boost::function<void(B)>)>
и т. Д., Пока вы не получите
boost::function<void(boost::function<void(boost::function<void(...)>)>)>
, который является типом бесконечной длины.
Однако вы можете определить (по крайней мере) один из двух типов какa struct
или 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); }
};
Вам может потребоваться добавить больше конструкторов и / или оператор преобразования, чтобы тип работал совершенно «прозрачно», или вы могли просто получить явный доступ к структуре.