Middle+
Hogy hívják a statikus polimorfizmus idiomatikus kifejezését C++-ban?
sobes.tech MI
Válasz az MI-től
Kíváncsi ismétlődő sablonminta (CRTP), más néven statikus polimorfizmus vagy fordítási időben történő polimorfizmus.
A CRTP elve azon alapul, hogy a Base sablonosztály saját magát használja sablonparaméterként, miközben ugyanakkor a Derived nevű származtatott osztály alap osztálya.
template <typename T>
class Base
{
public:
void interfaceMethod()
{
// Statikus hívás a 'implementationMethod' metódusra
// egy T típusú objektumon (amely a Derived)
static_cast<T*>(this)->implementationMethod();
}
// Itt nincs szükség virtuális metódusra
};
class Derived : public Base<Derived>
{
public:
void implementationMethod()
{
// Specifikus megvalósítás a Derived számára
// ...
}
};
A CRTP előnyei a dinamikus polimorfizmussal (virtuális funkciókkal) szemben:
- Teljesítmény: A függvényhívások statikusak és fordítási időben oldódnak meg, elkerülve a virtuális táblázat többletköltségét.
- Virtuális funkciók nélküli többletköltség: Nincs szükség vptr/vtbl tárolására vagy használatára.
- Szigorúbb típusellenőrzés: A típus inkompatibilitásai vagy a hiányzó implementációk hibái fordítási időben kerülnek észlelésre.
Hátrányok:
- A származó típusának ismerete szükséges: A bázis osztálynak sablonnak kell lennie, és "tudnia" kell a származó osztály típusát.
- Bonyolultabb kezdők számára: A minta kevésbé intuitív lehet a klasszikus örökléssel és virtuális funkciókkal összehasonlítva.
- Nem lehet különböző CRTP típusokat tartalmazó kollekciókkal dolgozni: Nem lehet különböző származtatott CRTP osztályok objektumait egy konténerben tárolni, és azokat bázismutató vagy -referencián keresztül hívni.
Összehasonlítás a dinamikus polimorfizmussal:
| Szempont | CRTP (statikus polimorfizmus) | Dinamikus polimorfizmus (virtuális funkciók) |
|---|---|---|
| Hívás feloldása | Fordítási időben | Futtatási időben |
| Teljesítmény | Magasabb (nincs vtbl költség) | Alacsonyabb (vtbl költséggel) |
| Extra költségek | Nincs vptr/vtbl | Vptr/vtbl-vel |
| Rugalmasság (gyűjtemények) | Nem (nem lehet különböző típusokat kezelni közös bázismutatóval vagy -referenciával) | Igen (különböző típusokat lehet kezelni) |
| Hibák felismerése | Fordítási időben | Futtatási időben |
| Komplexitás | Magasabb kezdők számára | Alacsonyabb kezdők számára |