C ++诀窍避免指针比较

时间:2014-08-28 12:58:37

标签: c++ pointers equality

我正在将代码库从一种编程风格转移到另一种编程风格。

我们有一个名为Operand的类型定义如下:

class Operand
{...};

然后我们

class OperandFactory
{
  public:
    const Operand *make_operand (...);
};

OperandFactory用于哈希Operand并将其保存在表格中。因此,如果使用相同的参数调用make_operand,则会在Operand扩散时获得相同的指针和指针比较。现在我需要添加一个使这个不可行的功能。所以,我在operator==中实现了Operand,如果我在Operand上进行指针比较,我希望以某种方式在编译时(更好)或运行时间(优于空)错误生成。实现这一目标的最佳途径是什么?

这只是在这个过渡阶段使用,所以我不介意解决方案看起来像黑客,只要它捕获代码库中的所有比较。

2 个答案:

答案 0 :(得分:3)

你可以重载operator的地址来返回一个句柄并声明两个句柄的比较(没有定义)。这会导致链接器错误。

#include <iostream>

class Op;

class Handle {
    Op *pri_;
public:
    explicit Handle(Op *o) : pri_(o) {}
    Op *operator->() const { return pri_; }
    Op &operator*() const { return *pri_; }
};

 // force compile time errors on comparison operators
bool operator==(const Handle &, const Handle &) = delete;
bool operator!=(const Handle &, const Handle &) = delete;
bool operator>=(const Handle &, const Handle &) = delete;
bool operator<=(const Handle &, const Handle &) = delete;
bool operator<(const Handle &, const Handle &) = delete;
bool operator>(const Handle &, const Handle &) = delete;

class Op {
    int foo_;
public:
    explicit Op(int i) : foo_(i) { }
    Handle operator&() { return Handle(this); };
    void touch() const { std::cout << "foobar"; }
};


int main(int argc, char **argv) {
    Op i{10};
    Op j{20};

    auto c = &j; // works
    c->touch(); // works
    (*c).touch(); // works

    if (&j == &i) {
        /* will not compile */
    }

}

注意

您必须满足random_access_iterator的{​​{1}}要求!

Handle

答案 1 :(得分:2)

Operand课程中添加操作员不会有帮助:您想要检测指针Operand的比较。不幸的是,本机类型运算符不能重载,指针是本机类型。这不是您正在寻找的解决方案。