0

我遇到了一个问题。我有一个 A 类,还有一个从 A 继承的类,我们称它为 B 类。我有虚函数。我想通过 operator== 将 A 和 B 与另一个 C 类进行比较。如果我想要一个 A 的列表,让我们在 stl 列表中说,我必须使用指向 A 的指针,所以它看起来像:

list<*A> list;

我也有:C something

但现在,我不能使用这个功能:find(list.begin(),list.end(),something) 因为我不能使用运算符 == 指针(*)。

我找到了解决方案,但我认为它不是最好的,所以我的问题是——我能做得更好吗?

    iter=list.begin();
    for(iter;iter!=list.end();++iter)
    {
        if((*iter).operator==(something)
            return ...
    }

谢谢你。

4

4 回答 4

5

您可以使用find_if,它允许您提供一个函数来检查相等的值。

auto check_something = 
     [&something](const list<*A>::iterator& iter){return *iter == something; };

find_if(list.begin(),list.end(),check_something)
于 2013-09-04T18:56:07.503 回答
1

您可以使用

if(**iter == something)

如果你想取消引用指针。

在 C++1x 中,还有

for(auto ptr : list)
    if(*ptr == something)
于 2013-09-04T18:38:37.087 回答
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;
于 2013-09-04T19:38:33.843 回答
0

您可能会看看boost::indirect_iterator哪个是专门为此目的而设计的。

find(
    boost::make_indirect_iterator( list.begin() ),
    boost::make_indirect_iterator( list.end() ),
    something );
于 2013-09-05T12:35:53.147 回答