我遇到了一个问题。 我有一个A类,一个继承自A的类,我们称之为B类。 我有虚拟功能。 我想通过operator ==将A和B与另一个C类进行比较。 如果我想要一个A的列表,让我们说在stl列表中, 我必须使用指向A的指针,所以它看起来像:
list<*A> list;
我也有:C something
但现在,我无法使用该功能:find(list.begin(),list.end(),something)
因为我不能使用operator ==指针(*)。
我找到了一个解决方案,但我认为它不是最好的,所以我的问题是 - 我可以做得更好吗?
iter=list.begin();
for(iter;iter!=list.end();++iter)
{
if((*iter).operator==(something)
return ...
}
谢谢。
答案 0 :(得分:5)
您可以使用find_if
,它可以让您提供检查相等值的功能。
auto check_something =
[&something](const list<*A>::iterator& iter){return *iter == something; };
find_if(list.begin(),list.end(),check_something)
答案 1 :(得分:1)
您可以使用
if(**iter == something)
如果你想取消引用指针。
在C ++ 1x中,还有
for(auto ptr : list)
if(*ptr == something)
答案 2 :(得分:1)
没有什么说你不能创建一个在指针或指针和对象组合上运行的全局非成员operator ==
。如果您有许多类型,则可以为任何类型模拟指针与对象相等的组合。
编辑以添加此提示:将比较放在带有对象的命名空间中,然后参数依赖查找将找到它而不会在捕获所有内容的范围内放置全局T* == T
:
namespace equals {
struct A {
A(int x) :x(x) { }
bool operator == (const A &other) const {
return other.x == x;
}
int x;
};
template <typename T>
bool operator == (const T *lhs, const T &rhs) {
return *lhs == rhs;
}
template <typename T>
bool operator == (const T &lhs, const T *rhs) {
return lhs == *rhs;
}
}
现在你可以做以下事情:
equals::A b(1), c(1);
if (b == &c) std::cerr << "good!" << std::endl;
答案 3 :(得分:0)
您可以查看专为此目的设计的boost::indirect_iterator
。
find(
boost::make_indirect_iterator( list.begin() ),
boost::make_indirect_iterator( list.end() ),
something );