【问题标题】:How do you override an operator to be used with a class pointer?您如何覆盖要与类指针一起使用的运算符?
【发布时间】:2019-03-15 10:28:47
【问题描述】:

假设我有:

class A {
    public:
        operator ==(int int_val) { return (m_int_val == int_val); }

    private:
        int m_int_val;
};

我可以这样做:

bool my_func(const A &a) { return (a == 42); }

甚至:

bool my_func(const A *a) { return ((*a) == 42); }

到目前为止一切顺利。但假设我有:

std::list<A *> a_list;

我想做类似的事情:

auto it = std::find(a_list.begin(), a_list.end(), 42);

然后编译器会抱怨,因为您无法将指向 A 的指针与整数进行比较。

我的问题不是如何用std::find_if 解决这个问题(只是为了抢先你们所有人)。我的问题是我可以为指向 A 的指针定义一个等价运算符,这样上面的 std::find 操作就可以工作了吗?如果可以,如何?

我在寻求更好地理解 C++ 时提出这个问题。

【问题讨论】:

    标签: c++


    【解决方案1】:

    你的操作符相当于重载1,2

    operator==(A const&, int);
    

    所以你想重载这个:

    operator==(A const*, int);
    

    ...但是you cannot 重载运算符,除非其参数之一具有用户定义的类型——并且指向任何类型的指针(例如,A const*)不是用户定义的。

    这里最简单的方法是使用std::find_if 而不是std::find 并提供一个lambda:

    auto it = std::find_if(std::begin(a_list), std::end(a_list),
                           [](auto const* pa) { return *pa == 42; });
    

    1你实际上重载了operator==(A&amp;, int),因为你没有const-限定方法(这应该是bool operator==(int int_val) const { ... })。

    2 对于此类运算符,您通常重载非成员函数而不是成员函数。

    【讨论】:

    • 感谢您的回答。我认为你的句子“......但是你不能......”最好用“你不能重载一个运算符,除非它的参数之一是非原始类型 - 并且任何类型的指针都是原始类型”(取自你链接的问题)。它更具体一点,也更清晰一点。
    • 在子注释 1 上,我想我理解您所说的“const 限定方法”是什么意思,但我不确定语法。我宁愿认为我已经编写了它,因此它可以与 const 实例一起使用。如果您可以将您所指的语法放在子注释中以帮助解释,那就太好了。
    • @AlastairG 我已经为const-qualified 方法添加了语法。我稍微改变了 1 的措辞,但我更喜欢使用 user-defined 版本,因为它是标准使用的版本(我不确定标准定义 primitive类型)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多