重载函数调用find_if的operator()

时间:2014-02-27 18:35:22

标签: c++ class operator-overloading

我有三个班级

class A
class B
class C

我有两张地图

std::map<A*, B*> myMap1;
std::map<A*, C*> myMap2;

和A

的对象指针

A* obj_ptr_A1 = new A;依此类推

我想在A *的两个地图上执行find_if,所以我写了一个仿函数并重载了operator()两次,如下所示

class functor
{
    private:
        A* m_member;
    public:
        explicit functor(A* input) : m_member(input){}

        bool operator()(const std::pair<A*, B*>& iter) const
        {
             return (m_member->GetValue() == (iter.first)->GetValue());
        }

        bool operator()(const std::pair<A*, C*>& iter) const
        {
             return (m_member->GetValue() == (iter.first)->GetValue());
        }
};

其中GetValue()是A返回整数的成员函数。 用法:

if(std::find_if(myMap1.begin(), myMap1.end(), functor(obj_ptr_A1)) != myMap1.end())
{
    std::cout << "Found in myMap1" << std::endl;
}


if(std::find_if(myMap2.begin(), myMap2.end(), functor(obj_ptr_A1)) != myMap2.end())
{
    std::cout << "Found in myMap2" << std::endl;
}

这给了我编译错误 error C3066: there are multiple ways that an object of this type can be called with these arguments 这种重载是错误的吗?

完整代码在这里http://pastebin.com/DnUQKHPp它会出现编译错误。

2 个答案:

答案 0 :(得分:0)

尝试以下(不进行测试)

template <class T>

class functor
{
    private:
        A* m_member;
    public:
        explicit functor(A* input) : m_member(input){}

        bool operator()(const std::pair<A*, T*>& iter) const
        {
             return (m_member->GetValue() == (iter.first)->GetValue());
        }
};

if(std::find_if(myMap1.begin(), myMap1.end(), functor<B>(obj_ptr_A1)) != myMap1.end())
{
    std::cout << "Found in myMap1" << std::endl;
}


if(std::find_if(myMap2.begin(), myMap2.end(), functor<C>(obj_ptr_A1)) != myMap2.end())
{
    std::cout << "Found in myMap2" << std::endl;
}

答案 1 :(得分:0)

我发现,如果您将比较Argument设为模板参数而不是A*,则可以在地图中执行不同的键值组合,前提是您设置了functor::operator() a Iterator的模板。

这就是仿函数的样子:

template<typename Argument> 
class functor
{
private:
    Argument m_member;
public:

    functor(Argument a)
        : 
            m_member(a)
    {}

    template<typename PairIterator>
    bool operator()(PairIterator iter) const
    {
        return (m_member->GetValue() == (iter.first)->GetValue());
    }
};

这是仿函数生成器:

template<typename Argument>
functor<Argument> make_functor(Argument const & a)
{
    return functor<Argument>(a); 
}

here是完整的在线示例。