[英]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.