friend



  • hi
    gibts eine möglichkeit ein friend auf alle klassen des selben types mit einem bestimmten anderen template-argument zu machen? also ich will etwa das erreichen:

    template<class T, class irrelevant>
    class myclass
    {
        // unter umständen grosse datenmengen, von "class irrelevant" unabhängig
    public:
        template<class rhs_irrelevant>
        myclass(myclass<T, rhs_irrelevant> const& Rhs) : grossedaten(rhs.grossedaten) {} // braucht zugriff, nicht verfügbar da andere typen
    };
    

    gibts ne möglichkeit da n friend zu schrieben oder sowas? wäre echt von vorteil, denn ansonsten habe ich laufzeit-einbussungen...

    mfg



  • Quick Fix:

    template<class,class> friend class myclass;
    

    "Besserer" Fix:

    template <class T>
    class myclass_base {
    protected:
      myclass_base()=default;
      myclass_base(myclass_base const& rhs)
        : grossedaten(rhs.grossedaten) {}
      int grossedaten;
    };
    
    template<class T, class irrelevant>
    class myclass : public myclass_base<T>
     ...
    


  • normalerweise bin ich jemand der immer versucht die bessere methode zu verwenden wenns zwei gibt. ich bin mir nicht sicher ob es wirklich unter lockerung der kapselung geht, wenn es nichtmal template-spezialisierungen o.ä. gibt...

    erste variante funktioniert soweit.



  • friend bewahrt in erster Linie das API davor, Member unnötigerweise public zu machen. Ich persönlich bin davon weggekommen, sehr spezifische friend -Deklarationen zu haben, um den Zugriff möglichst präzise einzuschränken. Einerseits ist die Syntax bei komplexeren Templates (besonders Funktionen) sehr mühsam, andererseits fügt man dazu nur einen weiteren Ort ein, wo man refactoren muss. Stattdessen habe ich manchmal eine Access -Klasse mit statischen Methoden, der Zugriff auf eine andere Klasse gewährt wird. Im Code sieht man dann auch schön, dass man auf private Member zugreift.

    Extra eine Vererbungshierarchie einzubauen scheint mir hier jedenfalls unangemessen...



  • nobodycaresyo schrieb:

    denn ansonsten habe ich laufzeit-einbussungen...

    Komisch.


Anmelden zum Antworten