Алик, сделай вызов с контекстом.
Например, перенеси те данные, которые ты сейчас хранишь в классе-обработчики, в класс перестановок.
Другой вариант -- сделать явный контекст. Например,
class Context {
// Данные, необходимые для классов-обработчиков
};
class Processor {
public:
virtual void new_context(); // создаёт свежий контекст
virtual void userproc(T& target, Context& context); // Обрабатывает данные и обновляет контекст
};
Получается, что ты выделяешь состояние объекта в некоторый внешний к нему объект. Тем самым снимается проблема доступа к состоянию.