Полагаю, лучшее решение зависит от того, что end имеет отношение к Reader .
Вы думали о базовом классе с частным наследованием (тип интерфейса)? Вы будете выставлять только то, что вам нужно, и это не будет доступно для других. Так же, как пример:
class ReaderInterface
{
public:
void method()
{
}
};
// This is your "end" class, derived from FunctorBase,
// the consumer of ReaderInterface
class Consumer
{
public:
Consumer(ReaderInterface readerInterface)
{
readerInterface.method();
}
};
class Reader : private ReaderInterface
{
public:
void test()
{
Consumer consumer(*this);
}
};