为I/O以外的东西重载移位运算符是一个好的设计吗?

Alw*_*ing 5 c++ operator-overloading a-star c++11

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

    successorNode -> OL // put the successor node into OL
    ...
    curNode <- OL // get the best node from OL and store it in curNode
Run Code Online (Sandbox Code Playgroud)

三个问题:

  1. 我的OL类是否有意义通过重载shift运算符来支持类似的表示法:

    OL ol;
    ...  
    OL << successorNode;
    ... 
    OL >> curNode;
    
    Run Code Online (Sandbox Code Playgroud)
  2. (只有当答案1"是"),我可以去尽量支持这种(不支持即使用coutcin为内置类型):

    OL ol;
    ...
    successorNode >> OL;
    ...
    curNode << OL;
    
    Run Code Online (Sandbox Code Playgroud)
  3. (仅当对1的答案为"是"时)对于标准容器,这种移位运算符的使用是否有意义:

    vector<int> v;
    v << 5; // instead of v.push_back(5)
    
    Run Code Online (Sandbox Code Playgroud)

编辑:这个问题的目的是双重的:

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

  • 问为什么不使用班次操作员来减少对标准容器的冗长使用.

and*_*ras 6

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

关于你的前两个问题:

最不惊讶原则的角度考虑它.如果有人看到您的代码,他会期待什么?它会立即明确是什么意思,或者,作为相反的极端,他会期望完全不同的东西吗?如果适用,超载是否值得冒险?例如,在了解了运营商的工作后,它是否使代码更加清晰?如果专业人士超过利弊,那就去吧!否则,不要.

作为这一点的副节点,我甚至遇到过这样的论点,即iostream运算符是运算符重载的一个不好的例子,因为它们不会移位整数.但是,我倾向于不同意,并将此视为个人意见.

适用于您当前的情况:用户是否可以通过致电运营商来获得其他结果?例如,他可能期望队列中的另一个结果?如果是这样,请不要超载.或者用户是否希望熟悉伪代码表示法,并看到相似性?如果是这样,请超载!

关于第三个问题:

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

QList<int> list;
list<<5;
Run Code Online (Sandbox Code Playgroud)

摘要:

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

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