假设我有
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 ++时问。
答案 0 :(得分:5)
您的运算符等效于重载 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 对于此类运算符,通常会重载非成员函数而不是成员函数。