2016-12-01 26 views
5

Mam zestaw klas, które implementują te same metody biznesowe. Planuję używać CRTP zamiast wirtualnej wysyłki ze względu na wydajność. Chciałbym jednak zachować wygodę kodowania dla pojedynczego interfejsu, który pochodzi z dziedziczenia i metod wirtualnych.Używanie CRTP z interfejsem

Czy można założyć, że moje wyspecjalizowane klasy dziedziczą z klasy abstrakcji szablonowej, która używa CRTP do przechowywania wspólnego kodu, a także dziedziczy po czystej klasie wirtualnej, aby móc tworzyć instancje każdego typu, ale mieć kod klienta zależy tylko od interfejsu? Co jeszcze ważniejsze, w jaki sposób mogę użyć CRTP, aby zapewnić pojedynczy interfejs do kodu klienta, mając jednocześnie wiele implementacji?

+0

Więc jeśli planujesz byłaby kod ze względów wydajności Metoda abstrakcyjna nie jest dobrym pomysłem ... użyć CRTP uniknąć wirtualny wysyłkę, która jest dlaczego jego wspólną alternatywną nazwą jest statyczny polimorfizm. Oczywiście z syntaktycznego punktu widzenia nikt nie może powstrzymać cię przed zrobieniem tego, ale IMHO musisz przemyśleć to przez ... –

+0

Publiczne metody nie byłyby w interfejsie, tylko w specjalizacjach. – ruipacheco

Odpowiedz

5

Pewnie. Można użyć takiego podejścia, które jest całkowicie poprawny:

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

Czy koszt środowiska wykonawczego byłby taki sam, jak przy użyciu wyłącznie funkcji czystych wirtualnych? – ruipacheco

+0

Tak, ponieważ szablony w ogóle nie mają żadnych obciążeń środowiska wykonawczego. – Smeeheey

+0

Więc patrząc na ten kod, CRTP nie da mi wiele w porównaniu do używania tylko czystych funkcji wirtualnych? Mam taką samą karę za wyniki? – ruipacheco