我有三个班级
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它会出现编译错误。
答案 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是完整的在线示例。