Sobes.tech
Middle+

Ako sa nazýva idiomatický výraz statickej polymorfizmu v C++?

sobes.tech AI

Odpoveď od AI

Zvedavý opakujúci sa vzor šablóny (CRTP), tiež známy ako statický polymorfizmus alebo polymorfizmus času kompilácie.

Princíp CRTP je založený na tom, že šablónová trieda Base používa ako šablónový parameter sama seba, pričom je základnou triedou pre nejakú odvodenú triedu Derived.

template <typename T>
class Base
{
public:
    void interfaceMethod()
    {
        // Statické volanie metódy 'implementationMethod'
        // na objekte typu Derived (ktorý je T)
        static_cast<T*>(this)->implementationMethod();
    }

    // Virtuálna metóda tu nie je potrebná
};

class Derived : public Base<Derived>
{
public:
    void implementationMethod()
    {
        // Implementácia špecifická pre Derived
        // ...
    }
};

Výhody CRTP oproti dynamickému polymorfizmu (s virtuálnymi funkciami):

  • Výkon: Volania funkcií sú statické a riešia sa počas kompilácie, čím sa vyhýba režii virtuálnej tabuľky.
  • Absencia režie za virtuálne funkcie: Nie je potrebné ukladať a používať vptr/vtbl.
  • Prísnejšie typovanie: Chyby spojené s nesúladom typov alebo chýbajúcou implementáciou sú odhalené pri kompilácii.

Nevýhody:

  • Nutnosť poznať typ potomka: Základná trieda musí byť šablónová a "vedieť" o type odvodeného triedy.
  • Složitosti pre začiatočníkov: Vzor môže byť menej intuitívny v porovnaní s klasickým dedičstvom s virtuálnymi funkciami.
  • Nemožnosť pracovať s kolekciou rôznych CRTP typov: Nie je možné ukladať v jednom kontajneri objekty rôznych odvodených CRTP tried a volať ich cez základný ukazovateľ alebo odkaz.

Porovnanie s dynamickým polymorfizmom:

Aspekt CRTP (statičný polymorfizmus) Dynamický polymorfizmus (virtuálne funkcie)
Riešenie volania Čas kompilácie Čas behu
Výkon Vyšší (bez režie vtbl) Nižší (s režiou vtbl)
Režijné náklady Bez vptr/vtbl Má vptr/vtbl
Flexibilita (kolekcie) Nie (nedá sa pracovať s rôznymi typmi cez spoločný ukazovateľ/odkaz) Áno (dá sa pracovať s rôznymi typmi)
Odhalenie chýb Čas kompilácie Čas behu
Zložitosť Vyššia pre začiatočníkov Nižšia pre začiatočníkov