繁体   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