繁体   English   中英

包含在智能指针中的类的运算符重载

[英]Operator overload of class wrapped in smart pointers

我一直在尝试在一个包含在智能指针中的类上进行一些运算符重载(*和+)。

auto p = std::make_unique<Polynomial<T>>();

当我尝试使用正常重载来重载它时,它显然要求智能指针类型。

编辑,所以:

std::unique_ptr<Polynomial<T>> operator+(const std::unique_ptr<Polynomial<T>>& right);

template<class T>std::unique_ptr<Polynomial<T>> Polynomial<T>::operator+(const std::unique_ptr<Polynomial<T>>& right) {
    //Do stuff
}

而错误:

尝试使用+运算符时出错

那么当类封装在smartpointer中时,如何重载正常运算符呢?

别。

在指针上运行这些操作,而不是在指针上:

*p = *p + *p

如果突然指针具有完全不同且意外的语义,那么对于代码的用户来说会非常混乱。

这对你来说也很困惑。

为了直接回答你的问题,我同意@LightnessRacesinOrbit: 不要 但是写另一个答案的原因是你问的问题对我来说听起来有点像XY问题

你有一个Polynomial<T>类,但你希望用户将它包装在智能指针中? 这很可疑,因为理智的设计只是希望用户直接使用Polynomial ,从而提供直接在该类型上工作的普通操作员。

退后一步,想一想为什么你认为智能指针会被使用/需要/有帮助。 通常,这是出于效率假设的原因而做的,对吧? 但这只是意味着你应该重新思考如何实现Polynomial本身。 请看以下内容:

  • Polynomial是否具有移动构造函数和分配? 如果没有,请实施它。
  • 存储的数据怎么样? 也许内部存储应该由智能指针管理。 与移动语义一起,这可以导致非常有效的操作。
  • 对于运算符重载,执行a+=b; ,使用库为您生成a+b 检查Boost.Operators或我的df.operators ,后者也是移动感知的。

使用正确的实现,使用std::unique_ptr<Polynomial<T>>的冲动应该消失:)

那么当类封装在smartpointer中时,如何重载正常运算符呢?

只需像平常一样声明它们:

template<typename T>
Polynomial<T> operator*(Polynomial<T> lhs, Polynomial<T> rhs) { ... }

template<typename T>
Polynomial<T> operator+(Polynomial<T> lhs, Polynomial<T> rhs) { ... }

然后给出类似的东西:

auto p = std::make_unique<Polynomial<int>>();
auto q = std::make_unique<Polynomial<int>>();

只需致电:

auto x = (*p) * (*q);
auto y = (*q) + (*p);

现场演示


您提供的错误:

在此输入图像描述

是由于您的运营商超载的事实:

std::unique_ptr<Polynomial<T>> operator+(const std::unique_ptr<Polynomial<T>>& right);

正在重载一元运算 operator+表达式+x

和另外一个:

template<class T>
std::unique_ptr<Polynomial<T>> Polynomial<T>::operator+(const std::unique_ptr<Polynomial<T>>& right) {
    //Do stuff
}

重载operator+Polynomial<T>std::unique_ptr<Polynomial<T>>类型的操作数。

因此给定两个unique_ptr<Polynomial<T>> ,即xy ,表达式如下:

x + y

找不到operator+的重载决策。

我也强烈反对标准库类型的运算符重载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM