我有这样的矢量:
typedef vector<Message*> OmciMessages;
OmciMessages omciResponses;
我有一个像下面这样的仿函数我怀疑是不正确的:
class isMatching{
public:
bool operator()(const Message* responseMsg,unsigned short transactionid){
return responseMsg->getTransactionId()==transactionid;
}
};
然后我调用find_if并想使用函子在向量中找到一些内容,但仅限于我的类中的特定transactionid:
OmciMessages::iterator responseit
= find_if(omciResponses.begin(),
omciResponses.end(),
bind2nd(isMatching(),transactionid));
编译器不喜欢它并产生了很多错误消息,这些消息通常很难解释为模板类。
/repo/stuyckp/ngpon2WW/tools/cm4/tools/GNU/src/gcc/i686-pc-linux-gnu/bin/../lib/gcc/i686-pc-linux-gnu/3.4.6/../../../../../include/c++/3.4.6/bits/stl_function.h:429: error: no type named `first_argument_type' in `class isMatching'
如果我在没有函数对象的情况下这样做,它就有用了:
static bool isMatching(Message* responseMsg){
return responseMsg->getTransactionId()==transactionid;
}
transactionid = 5; //global variable being used. yuck, don't like it
find_if(omciResponses.begin(),
omciResponses.end(),
isMatching);
然后我需要一个事先设置的全局变量事务id,我认为这不是一个好设计。 那么应该如何用bind2nd方法完成呢?
答案 0 :(得分:2)
bind2nd需要您的仿函数类具有适应性,即提供某些typedef,包括first_argument_type
,second_argument_type
和result_type
。您可以在仿函数类中自己定义它们,或者从std::binary_function继承以使其变得简单:
class isMatching : public std::binary_function<const Message*, unsigned short, bool> {
public:
bool operator()(const Message* responseMsg, unsigned short transactionid) const {
return responseMsg->getTransactionId() == transactionid;
}
};
答案 1 :(得分:2)
考虑到编译器的版本,我假设C ++ 11不是一个选项(否则答案很简单:使用lambda)。
旧的函数对象绑定器(在C ++ 11中已弃用,在C ++ 17中删除)需要一堆嵌套的typedef。您需要将result_type
,first_argument_type
和second_argument_type
定义为isMatching
的成员,直接或通过binary_function
帮助程序(在C +中也已弃用) +11并在C ++ 17中删除,与bind2nd
一起使用。
您还可以使用带有两个参数的普通函数,使用ptr_fun
进行调整(再次,在C ++ 11中弃用并在C ++ 17中删除),然后与bind2nd
绑定。
或者只使用有状态的仿函数,如Piotr的回答所示。
答案 2 :(得分:1)
struct isMatching
{
unsigned short transactionid;
explicit isMatching(unsigned short transactionid) : transactionid(transactionid) {}
bool operator()(const Message* responseMsg) const
{
return responseMsg->getTransactionId() == transactionid;
}
};
std::find_if(omciResponses.begin()
, omciResponses.end()
, isMatching(0));
// ^ transactionId to be searched for
请注意,如果您想使用std::bind2nd
,或者函数对象是无状态的,那么您根本不需要函数对象作为单独的类:
bool isMatching(const Message* responseMsg, unsigned short transactionid)
{
return responseMsg->getTransactionId() == transactionid;
}
std::find_if(omciResponses.begin()
, omciResponses.end()
, std::bind2nd(std::ptr_fun(&isMatching), 0));
// ~~~~~~~~~~~^ ^ transactionId to be searched for
// transform to a function object