Rückgabe



  • Hallo,

    ich möchte eure Meinung zu folgendes gerne hören.

    **1.)**Beispiel aus Anwendungsfall

    template<class T, _ulong imax>
    template<typename X>
    const sRGB<X>&
    ProPhotoRGB<T, imax>::conversionTosRGB() const
    {
    
        const T r = nonlinearDecodingofROMMRGB(this->r);
        const T g = nonlinearDecodingofROMMRGB(this->g);
        const T b = nonlinearDecodingofROMMRGB(this->b);
    
        const T rs =  2.0564 * r - 0.7932 * g - 0.2632 * b;
        const T gs = -0.2118 * r + 1.2490 * g - 0.0372 * b;
        const T bs = -0.0152 * r - 0.1405 * g + 1.1556 * b;
    
        return *(new sRGB<X> (nonlinearDecodingTosRGB(rs), nonlinearDecodingTosRGB(
                gs), nonlinearDecodingTosRGB(bs)));
    }
    

    Wo her soll nun der Benutzer der Mehtode wissen, ob die Referenz an das Objekt gebunden oder neu erzeugt wurde?
    Welche Lösung bieten sich an, wenn die Member von sRGB nicht öffentlich zugänglich sind?
    Was haltet ihr von friend + einen neuen Parameter, der das zu befühlende Objekt enthält?

    template<class T, _ulong imax>
    template<typename X>
    void
    ProPhotoRGB<T, imax>::conversionTosRGB(const sRGB<X>& fill) const
    {
    
        const T r = nonlinearDecodingofROMMRGB(this->r);
        const T g = nonlinearDecodingofROMMRGB(this->g);
        const T b = nonlinearDecodingofROMMRGB(this->b);
    
        const T rs =  2.0564 * r - 0.7932 * g - 0.2632 * b;
        const T gs = -0.2118 * r + 1.2490 * g - 0.0372 * b;
        const T bs = -0.0152 * r - 0.1405 * g + 1.1556 * b;
    
        fill.r = nonlinearDecodingTosRGB(rs);
        fill.g = nonlinearDecodingTosRGB(gs);
        fill.b = nonlinearDecodingTosRGB(bs);
    }
    

    2.) Auf welche Weiße würdet ihr das lösen?
    Möglichkeit 1:

    template<class T, _ulong imax>
    inline const T
    ProPhotoRGB<T, imax>::nonlinearDecodingTosRGB(const T& X) const
    {
        T res;
    
        if (X <= 0.0031308)
            res = 255.0 * (12.92 * X);
    
        else
            res = 255.0 * (pow(1.055 * X, 1.0 / 2.4) - 0.055);
    
        return res;
    }
    

    Möglichkeit 2:

    template<class T, _ulong imax>
    inline const T&
    ProPhotoRGB<T, imax>::nonlinearDecodingTosRGB(const T& X, T& res) const
    {
        if (X <= 0.0031308)
            res = 255.0 * (12.92 * X);
    
        else
            res = 255.0 * (pow(1.055 * X, 1.0 / 2.4) - 0.055);
    
        return res;
    }
    

    Möglichkeit 3:

    template<class T, _ulong imax>
    inline void
    ProPhotoRGB<T, imax>::nonlinearDecodingTosRGB(const T& X, T& res) const
    {
        if (X <= 0.0031308)
            res = 255.0 * (12.92 * X);
    
        else
            res = 255.0 * (pow(1.055 * X, 1.0 / 2.4) - 0.055);
    
        return res;
    }
    

    Möglichkeit 4:
    ???

    Gruß,
    Thomas


  • Mod

    Siassei schrieb:

    Wo her soll nun der Benutzer der Mehtode wissen, ob die Referenz an das Objekt gebunden oder neu erzeugt wurde?

    Das kann er nicht. Wenn ein neues Objekt zurückgegeben werden soll, tu genau das und nicht mehr. Falls das Objekt aus irgendwelchen Gründen auf dem freestore existieren muss benutze einen geeigneten Smartpointer für die Rückgabe - das dient der Sicherheit und ist gleichzeitig selbstdokumentierend: auto_ptr ist hier der richtige Kandidat (shared_ptr/intrusive_ptr o.ä. sind auch möglich, beschränken allerdings die Freiheit des Aufrufers und bedürfen somit zusätzlicher Rechtfertigung).

    Siassei schrieb:

    Welche Lösung bieten sich an, wenn die Member von sRGB nicht öffentlich zugänglich sind?

    Das sollte der Normalfall sein, und genau hierfür existieren Konstruktoren.

    Siassei schrieb:

    Was haltet ihr von friend + einen neuen Parameter, der das zu befühlende Objekt enthält?

    nichts, es sei denn es wird gut begründet.

    zu 2.) Argumentation wie oben, außer dass ggf. darüber nachzudenken wäre, die Funktion als freies Template zu implementieren: das beugt Codebloat vor, denn ProPhotoRGB<T, imax1>::nonlinearDecodingTosRGB und ProPhotoRGB<T, imax2>::nonlinearDecodingTosRGB haben nichts miteinander zu tun, obwohl die Funktion offensichtlich nicht von allen Templateparametern oder dem Zustand des Klassenobjekts abhängt.


Log in to reply