c++ - 如何重写要与类指针一起使用的运算符?

标签 c++

假设我有:

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++ 时提出这个问题。

最佳答案

你的运算符相当于重载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&, int) 因为你没有 const 限定方法 (这应该是 bool operator==(int int_val) const { ... })。

2 对于这样的运算符,您通常会重载非成员函数而不是成员函数。

关于c++ - 如何重写要与类指针一起使用的运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55180535/

相关文章:

c++ - 生成随机但不重复的数字 (C++)

c++ - 覆盖 Direct3D 接口(interface)?

C++ CreateProcess 无法从 Windows 7 上的套接字接收路径 (64)

c++ - 你有在圆上应用函数的技巧吗?

c++ - 将 C++ 的相同功能/概念转换为序言

c++ - 如何在 C++ 中调用::CreateProcess 来启动 Windows 可执行文件?

c++ - 没有窗口的 Win32 设备上下文

C++:gcc/g++ 编译器错误 logf 不是 std 的成员

c++ - 井字游戏

c++ - 声明一个带有微小单元的巨大动态数组 [C++]