簡體   English   中英

如何在C ++中的兩個類之間定義(重載)對稱二進制運算符,並考慮r值?

[英]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 如果我們要復制它,最好在簽名中也做。

要速度嗎? 傳遞價值。 是用於刪除R const&R&&重載作為冗余的技術。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM