重载find_if的函数调用运算符()
Overload Function call operator () for find_if
我有三个类
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);
}
这是完整的在线示例。
相关文章:
- C++ 如何重载 [] 运算符并进行函数调用
- 在 C++ 中调用类中的运算符函数
- NOEXCEPT 函数调用运算符的说明符_Not_fn
- 检查类是否具有可能重载的函数调用运算符
- C++函数调用与许多点运算符
- C++ 类的构造函数和函数调用运算符 () 重载之间的歧义
- 重载运算符主体仅包含一个函数调用
- 重载<<运算符的函数调用 (C++)
- 使用赋值运算符将宏转换为函数调用
- 为什么将"<<"运算符作为函数调用会导致"ambiguous call"编译器错误?
- 如何调用运算符函数添加两个对象?
- 将函数调用替换为重载运算符 C++
- 在呼叫运算符函数const中调用运算符时错误
- 运算符 () 括号是否会在函数调用中创建的对象上调用
- 当您可以使用构造函数时,为什么要重载 C++ 类或结构中的 () 运算符(可调用运算符)
- 重载时获取堆栈溢出 >> 运算符函数是为类调用的。我需要进行哪些更改?
- 内置运算符(新的,删除和函数调用除外)如何返回
- 为下标运算符和函数调用运算符提供默认参数
- 使用重载运算符在函数调用时执行操作
- 流输出和隐式void*cast运算符函数调用