gpt4 book ai didi

c++ - 为 I/O 以外的事物重载移位运算符是否是一个好的设计?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:27 25 4
gpt4 key购买 nike

我正在为 A* 搜索算法实现开放列表 (OL) 类。 OL 基本上是搜索节点的专用优先级队列。在描述 A* 算法的伪代码中经常看到这样的符号:

    successorNode -> OL // put the successor node into OL
...
curNode <- OL // get the best node from OL and store it in curNode

三个问题:

  1. 我的 OL 类通过重载移位运算符来支持类似的符号是否有意义:

    OL ol;
    ...
    OL << successorNode;
    ...
    OL >> curNode;
  2. (仅当对 1. 的回答为"is"时)我能否尽可能地支持这一点(即 coutcin 用于内置类型):

    OL ol;
    ...
    successorNode >> OL;
    ...
    curNode << OL;
  3. (仅当 1. 的答案为"is"时)移位运算符的这种用法对标准容器是否有意义:

    vector<int> v;
    v << 5; // instead of v.push_back(5)

编辑:这个问题的目的有两个:

  • 询问提议的设计是否违反了重载运算符应该模仿这些运算符对内置/标准类型的含义的原则。

  • 询问为什么不使用移位运算符来简化标准容器的使用。

最佳答案

您问题的答案很可能主要基于个人意见,因为没有硬性规定允许/禁止这种运算符重载的使用。因此,我将提出论据来帮助您决定这是否是一个好主意,而不是硬性回答。

关于您的前两个问题:

最小意外原则的角度考虑一下。如果有人看到你的代码,他会期待什么?会立即清楚这是什么意思,或者,作为相反的极端,他(她)会期待完全不同的东西吗?如果适用,重载值得惊喜吗?比如,了解了operators是干什么的,是不是让代码更清晰?如果利大于弊,那就去吧!否则,不要。

作为这一点的一个侧面节点,我什至遇到了这样的论点,即 iostream 运算符是运算符重载的一个坏例子,因为它们不移动整数。但是,我倾向于不同意,并将其视为个人意见。

应用于您当前的情况:用户可能希望通过调用接线员获得其他结果吗?例如。他可能会期待队列中的另一个结果吗?如果是这样,请不要重载。还是希望用户熟悉伪代码符号,并看到相似之处?如果是这样,请重载!

关于第三个问题:

有些人同意,有些人不同意。例如,Qt 框架的容器支持这种用法:

QList<int> list;
list<<5;

总结:

答案取决于它是否使您的代码更具可读性(当然还有个人意见)。

注意:所有这些仅适用于没有风格指南或禁止使用运算符重载的情况!

关于c++ - 为 I/O 以外的事物重载移位运算符是否是一个好的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31605526/

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