Curious Mixins



  • Ja. Wie dir der Compiler ja schon gesagt hat. Und ich versucht habe zu erklären. Ich wundere mich ehrlich gesagt etwas dass das so schwer zu verstehen ist.



  • @sewing sagte in Curious Mixins:

    Im Grunde geht es mir darum den Barton-Nackman Trick nachzuvollziehen, der ja auf eine friend definition in der CRTP Basisklarre setzt

    Der Barton-Nackman Trick ist eigentlich recht einfach.
    Mit friend kannst du innerhalb einer Klassendefinition freie Funktionen definieren. (Die freien Funktionen nur zu deklarieren ginge auch, aber in diesem Fall wollen wir sie auch gleich definieren.)
    Netterweise ist das auch erlaubt wenn die Klassendefinition durch ein Template erzeugt wird. (Die Signatur der freien Funktionen muss dabei natürlich abhängig von (zumindest) einem Template-Argument sein, sonst bekommst du genau das Problem das du hier beobachtet hast.)

    Jetzt ist es bei Mixins normalerweise nötig im Mixin Template per static_cast auf den abgeleiteten Typ zu casten. Weil die Memberfunktionen des Mixin ja Memberfunktionen des Mixins sind, und nicht Memberfunktionen der abgeleiteten Klasse.

    Bei freien Funktionen kannst du dir aber aussuchen welchen Typ die Parameter haben. Und da kann man dann natürlich gleich den Typ der abgeleiteten Klasse verwenden.

    D.h. wenn du

    template <class Derived>
    class Comparable {
    ...
        friend bool operator == (Derived const& x, Derived const& y) {
          ...
        }
    };
    

    schreibst, dann wird beim Instanzieren von Comparable<Foo> auch die freie Funktion bool operator == (Foo const& x, Foo const& y) definiert.

    Diese ist zwar nur per ADL "auffindbar", aber da Foo ja von Comparable<Foo> abgeleitet ist, sucht der Compiler bei ADL für Foo auch bei Comparable<Foo>, und findet daher die per friend definierten Funktionen.

    Und da diese eben direkt Derived als Parameter nehmen, muss man darin nichts mehr casten.

    Steht aber eigentlich alles hier beschrieben: https://en.wikipedia.org/wiki/Barton–Nackman_trick



  • Also deine letzte Erklärung war super verständlich. Hab vielen Dank dafür, hat mir sehr geholfen


Anmelden zum Antworten