Хм, во-первых, остерегайтесь состояний в функторах.
Большинство реализаций алгоритмов в STL могут копировать ваши функторы, поэтому вам обычно приходится извлекать состояние во внешнюю структуру.
Теперь, для применения функторов, все просто: пусть ваши классы объявят функцию-член шаблона!
class A
{
public:
template <class Functor>
Functor Apply(Functor f);
private:
};
class B
{
public:
template <class Functor>
Functor Apply(Functor f);
};
// Usage
MyFunctor f;
A a;
B b;
b.Apply(a.Apply(f));
Что касается функтора, если вам нужно указать:
// Alternative 1
class FunctorState {};
class Functor
{
public:
Functor(FunctorState& state): m_state(state) {}
// some operator()(...)
private:
FunctorState& m_state;
};
// Alternative 2
class Functor
{
struct FunctorState {};
public:
Functor(): m_state(new FunctorState) {}
// some operator()(...)
private:
boost::shared_ptr<FunctorState> m_state;
};
Таким образом, копии Functor
все указывают на один и тот же экземпляр FunctorState
. Просто выберите в зависимости от того, хотите ли вы получить доступ к состоянию вне класса или нет.