У меня есть 2 решения для одной и той же проблемы - сделать какие-то обратные вызовы от одного "контроллера" к используемому объекту, и я не знаю, что выбрать.
Решение 1: Использовать интерфейсы
struct AInterface
{
virtual void f() = 0;
};
struct A : public AInterface
{
void f(){std::cout<<"A::f()"<<std::endl;}
};
struct UseAInterface
{
UseAInterface(AInterface* a) : _a(a){}
void f(){_a->f();}
AInterface* _a;
};
Решение 2: Используйте шаблоны
struct A
{
void f(){std::cout<<"A::f()"<<std::endl;}
};
template<class T>
struct UseA
{
UseA(T* a) : _a(a){}
void f(){_a->f();}
T* _a;
};
Это простой пример, иллюстрирующий мою проблему. В реальном мире интерфейс будет иметь несколько функций, и один класс может (и будет!) Реализовывать несколько интерфейсов.
Код не будет использоваться как библиотека для внешних проектов, и мне не нужно скрывать реализацию шаблона - я говорю это, потому что первый случай будет лучше, если мне нужно скрыть реализацию "контроллера".
Не могли бы вы рассказать мне о преимуществах/недостатках для каждого случая и о том, что лучше использовать?