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