Sobes.tech
Middle+
179

Jak nazywa się idiom statycznego polimorfizmu w C++?

Odpowiedź od AI

sobes.tech AI

Kuriozalnie powtarzający się wzorzec szablonu (CRTP), znany również jako statyczna polimorfizm lub polimorfizm w czasie kompilacji.

Zasada CRTP opiera się na tym, że klasa szablonowa Base używa siebie samej jako parametru szablonu, będąc jednocześnie klasą bazową dla klasy pochodnej Derived.

template <typename T>
class Base
{
public:
    void interfaceMethod()
    {
        // Statyczne wywołanie metody 'implementationMethod'
        // na obiekcie typu Derived (który jest T)
        static_cast<T*>(this)->implementationMethod();
    }

    // Nie jest potrzebna tutaj metoda wirtualna
};

class Derived : public Base<Derived>
{
public:
    void implementationMethod()
    {
        // Implementacja specyficzna dla Derived
        // ...
    }
};

Zalety CRTP w porównaniu do polimorfizmu dynamicznego (z funkcjami wirtualnymi):

  • Wydajność: Wywołania funkcji są statyczne i rozwiązywane w czasie kompilacji, unikając narzutu związanego z tablicą wirtualną.
  • Brak narzutu funkcji wirtualnych: Nie ma potrzeby przechowywania ani używania vptr/vtbl.
  • Ścisłe typowanie: Błędy związane z niezgodnością typów lub brakiem implementacji są wykrywane na etapie kompilacji.

Wady:

  • Konieczność znajomości typu klasy pochodnej: Klasa bazowa musi być szablonowa i "wiedzieć" o typie klasy pochodnej.
  • Złożoność dla początkujących: Wzorzec może być mniej intuicyjny w porównaniu z klasycznym dziedziczeniem z funkcjami wirtualnymi.
  • Niemożność pracy z kolekcjami różnych typów CRTP: Nie można przechowywać w jednym kontenerze obiektów różnych klas pochodnych CRTP i wywoływać ich przez wskaźnik lub referencję bazową.

Porównanie z polimorfizmem dynamicznym:

Aspekt CRTP (statyczny polimorfizm) Polimorfizm dynamiczny (funkcje wirtualne)
Rozwiązanie wywołania W czasie kompilacji W czasie wykonania
Wydajność Wyższa (brak narzutu vtbl) Niższa (z narzutem vtbl)
Koszty dodatkowe Brak vptr/vtbl Z vptr/vtbl
Elastyczność (kolekcje) Nie (nie można pracować z różnymi typami przez wspólny wskaźnik/bazę) Tak (można pracować z różnymi typami)
Wykrywanie błędów W czasie kompilacji W czasie wykonania
Złożoność Wyższa dla początkujących Niższa dla początkujących