Sobes.tech
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