gpt4 book ai didi

c++ - find_if on vector with bind2nd 和 functor

转载 作者:太空狗 更新时间:2023-10-29 20:38:15 26 4
gpt4 key购买 nike

我有一个这样的 vector :

typedef vector<Message*> OmciMessages;
OmciMessages omciResponses;

我有一个像下面这样的仿函数,我怀疑它是不正确的:

class isMatching{
public:
bool operator()(const Message* responseMsg,unsigned short transactionid){
return responseMsg->getTransactionId()==transactionid;
}
};

然后我调用 find_if 并希望使用仿函数在 vector 中查找某些内容,但仅限于我的类中的特定事务 ID:

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 方法来完成呢?

最佳答案

鉴于您的编译器版本,我假设 C++11 不是一个选项(否则答案很简单:使用 lambda)。

旧的函数对象绑定(bind)器(在 C++11 中弃用,在 C++17 中移除)需要一堆嵌套的 typedef。您需要直接或通过 result_typefirst_argument_typesecond_argument_type 定义为 isMatching 的成员>binary_function 帮助程序(在 C++11 中也已弃用并在 C++17 中删除),以便与 bind2nd 一起使用。

您还可以使用带有两个参数的普通函数,使用 ptr_fun 对其进行调整(同样,在 C++11 中弃用并在 C++17 中移除),然后使用 进行绑定(bind)bind2nd.

或者只使用状态仿函数,如 Piotr 的回答所示。

关于c++ - find_if on vector<Message*> with bind2nd 和 functor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32264215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com