[英]How to define (overload) symmetrical binary operator between two classes in C++, taking r-values into account?
我想要的是:R = V + R = R +V。我該怎么做:
R operator+(const R &r, const V &v) { return R(r) += v; }
R operator+(R &&r, const V &v) { return R(r) += v; }
R operator+(const R &r, V &&v) { return R(r) += v; }
R operator+(R &&r, V &&v) { return R(r) += v; }
R operator+(const V &v, const R &r) { return r + v; }
R operator+(V &&v, const R &r) { return r + v; }
R operator+(const V &v, R &&r) { return r + v; }
R operator+(V &&v, R &&r) { return r + v; }
有沒有更短的方法?
因為無論如何都將通過const R&
或R&&
創建r
的實例,因此這將縮短4行:
R operator+(R r, const V& v) { return std::move(r += v); }
R operator+(R r, V&& v) { return std::move(r += std::move(v)); }
R operator+(const V& v, R r) { return std::move(r += v); }
R operator+(V&& v, R r) { return std::move(r += std::move(v)); }
但是,我認為這對您來說已經足夠,除非您的R::operator+=(V&&)
與R::operator+=(const V&)
實現有所不同:
R operator+(R r, const V& v) { return std::move(r += v); }
R operator+(const V& v, R r) { return std::move(r += v); }
我的答案是在我不知道此實現時寫的:
R operator+=(R&& r, const V& v)
R operator+=(R&& r, V&& v)
考慮到這些功能,Yakk的答案會更好。
假設:
R& operator+=( R& r, const V& v );
R& operator+=( R& r, V&& v );
R operator+=( R&& r, const V& v ) { r += v; return std::move(r); }
R operator+=( R&& r, V&& v ) { r += std::move(v); return std::move(r); }
我們本應該:
R operator+( R r, V const& v ) { return std::move(r)+=v; }
R operator+( R r, V && v ) { return std::move(r)+=std::move(v); }
R operator+( V const& v, R r ) { return std::move(r)+=v; }
R operator+( V && v, R r ) { return std::move(r)+=std::move(v); }
我假設R
便宜,而帶V&&
+=
僅比V const&
。
注意, R operator+=( R&& r, ? )
的返回值應該是一個值。 我用+=(const&,?)
實現它,然后移到返回值中。
這意味着您必須在上述樣板之外實現兩個+=
運算符。
如果從移走的V
沒有收益,我們將得到:
R& operator+=( R& r, const V& v );
R operator+=( R&& r, const V& v ) { r += v; return std::move(r); }
R operator+( R r, V const& v ) { return std::move(r)+=v; }
R operator+( V const& v, R r ) { return std::move(r)+=v; }
3個樣板,一個實際實現的功能。
如果您不喜歡R operator+=( R&& r, const V& v)
,可以將其重寫為:
R& operator+=( R& r, const V& v );
R operator+( R r, V const& v ) { return std::move(r+=v); }
R operator+( V const& v, R r ) { return std::move(r+=v); }
對於V&&
案例,如果需要,類似地:
R& operator+=( R& r, V&& v );
R operator+( R r, V&& v ) { return std::move(r+=std::move(v)); }
R operator+( V&& v, R r ) { return std::move(r+=std::move(v)); }
我們在operator+
的簽名中而不是在內部復制R
; 如果我們要復制它,最好在簽名中也做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.