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 |