2016-12-01 10 views
5

У меня есть набор классов, которые реализуют те же бизнес-методы. Я планирую использовать CRTP вместо виртуальной отправки из-за причин производительности. Но я хотел бы сохранить удобство кодирования в одном интерфейсе, который поставляется с наследованием и виртуальными методами.Использование CRTP с интерфейсом

Возможно ли, чтобы мои специализированные классы наследовали как шаблонный абстрактный класс, который использовал бы CRTP для хранения общего кода, так и наследует от чистого виртуального класса, поэтому я могу создавать экземпляры каждого типа, но иметь код моего клиента зависят только от интерфейса? Еще лучше, как я могу использовать CRTP для обеспечения единого интерфейса для кода клиента при наличии нескольких реализаций?

+0

Ну, если вы планируете реорганизовать код из соображений производительности абстрактный метод не является хорошей идеей ... Вы можете использовать CRTP, чтобы избежать виртуальной отправки, которая почему его общее альтернативное имя - статический полиморфизм. Конечно, с синтаксической точки зрения никто не может помешать вам это сделать, но IMHO вам нужно продумать это ... –

+0

Публичные методы не были бы в интерфейсе, только в специализациях. – ruipacheco

ответ

5

Несомненно. Вы можете использовать такой подход, как это, что вполне справедливо:

class Interface 
{ 
public: 
    virtual void doSomething() = 0; 
    //... 
}; 

template<typename T> 
class GeneralImpl : public Interface 
{ 
public: 

    void doSomething() override 
    { 
     auto someDetail = T::somethingStatic(); 
     //... 
     static_cast<T*>(this)->someMember(); 
     //... 
    } 
} 

class SpecificImpl : public GeneralImpl<SpecificImpl> 
{ 
public: 
    static int somethingStatic() 
    { 
     //... 
    } 

    void someMember() 
    { 
     //... 
    } 
}; 

int main() 
{ 
    std::vector<Interface*> vec; 
    SpecificImpl instance; 

    //... 

    vec.push_back(&instance); 

    //... 

    for(auto* inst : vec) { 
     inst->doSomething(); 
    } 

    //... 
} 
+0

Будет ли стоимость исполнения такой же, как использование только виртуальных функций? – ruipacheco

+0

Да, потому что шаблоны вообще не имеют накладных расходов. – Smeeheey

+0

Так что, глядя на этот код, CRTP не даст мне многого по сравнению с использованием только виртуальных функций? У меня такая же производительность? – ruipacheco