Я заинтересован в реализации интерфейса.Я знаю, что стандартный способ сделать это - кодировать класс, имеющий чисто виртуальные методы, которые будут использоваться в качестве интерфейса, например:
class Interface {
public:
virtual void doSometing() = 0;
}
, и использовать его:
class Implementation : public Interface {
public:
virtual void doSomething() override { ... }
}
Или даже лучше применить NVI (не виртуальный интерфейс).
Но все они используют виртуальные функции, которых я стараюсь избегать - поскольку я пишу код для встраиваемых систем, где необходимо учитывать потерю производительности из-за косвенных обращений к vtable.
Поэтому я сосредоточился на «статическом полиморфизме» и попытался использовать CRTP для реализации интерфейсов:
template<typename T>
class Interface {
public:
void doSomething() {
static_cast<T&>(*this)._doSomething();
}
class Implementation : public Interface<Implementation> {
public:
void _doSomething() { /* Do implementation specific stuff here */ }
}
class Implmentation2 : public Interface<Implementation2> {...}
Пока все хорошо.Но я вижу одну большую проблему.Когда я хочу сохранить несколько указателей на интерфейс какого-либо контейнера и получить доступ к экземплярам различных классов реализации, я сталкиваюсь с проблемой: Interface<T>
всегда является отдельным классом, а не единственным интерфейсом:
Interface<Implementation>
и Interface<Implementation2>
- это разные типы.
Хорошо, давайте создадим общий базовый класс для получения интерфейсов из ...
template<typename T>
class Interface : public IfaceBase {
public:
void doSomething() {
static_cast<T&>(*this)._doSomething();
}
... но тогда яне может получить доступ к конечному экземпляру с помощью интерфейса.Мне кажется, я пытаюсь создать интерфейс для интерфейса, который звучит безумно само по себе в любом случае ...
Так что я обнаружил, что CRTP не слишком пригоден для использования в этом случае.Я искал в Интернете и нашел MIXIN, который, кажется, "CRTP перевернулся".Но я не уверен, что это можно использовать для моих целей ...
Не могли бы вы мне помочь?Если есть способ применения MIXINS или любой другой идиомы / любой другой, чтобы иметь интерфейсы C ++ без виртуалов, пожалуйста, поделитесь идеей:)
Заранее большое спасибо всем, кто хочет помочь!Ура Мартин