gpt4 book ai didi

c++ - 如何在 C++ 中的两个类之间定义(重载)对称二元运算符,同时考虑 r 值?

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:51 28 4
gpt4 key购买 nike

我想要的是: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; }

有没有更短的路?

最佳答案

假设:

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 而不是在内部;如果我们无论如何要复制它,不妨在签名中复制它。

Want speed? Pass by value.是用于删除 R const&R&& 重载冗余的技术。

关于c++ - 如何在 C++ 中的两个类之间定义(重载)对称二元运算符,同时考虑 r 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40613667/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com