重载find_if的函数调用运算符()

Overload Function call operator () for find_if

本文关键字:运算符 函数调用 find if 重载      更新时间:2023-10-16

我有三个类

class A
class B
class C

我有两张地图

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

和的对象指针

A* obj_ptr_A1 = new A;

我想对a*的两个映射执行find_if,所以我写了两次函子和重载运算符(),如下所示

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它给出了编译错误。

尝试以下操作(无需测试)

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;
}

我发现,如果将比较Argument作为模板参数而不是A*,则可以在映射中进行不同的键值组合,前提是将functor::operator()作为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); 
}

这是完整的在线示例。