bind如何知道何时转换到指针? 我在C++中发现了一个有趣的事情。 using namespace std; struct Person { string name; bool check() { return name == "carol"; } }; int main() { Person p = { "Mark" }; list<Person> l; l.push_back(p); if (find_if(l.begin(), l.end(), bind(&Person::check, std::placeholders::_1)) == l.end()) { cout << "Not found"; } return 0; }
我已经想出了这样的办法,但我不确定这是否是最好的办法bind如何知道何时转换到指针? 我在C++中发现了一个有趣的事情。 using namespace std; struct Person { string name; bool check() { return name == "carol"; } }; int main() { Person p = { "Mark" }; list<Person> l; l.push_back(p); if (find_if(l.begin(), l.end(), bind(&Person::check, std::placeholders::_1)) == l.end()) { cout << "Not found"; } return 0; },c++,stl,iterator,C++,Stl,Iterator,我已经想出了这样的办法,但我不确定这是否是最好的办法 find_if(l.begin(), l.end(), bind([](Person& p) { return p.check(); }, std::placeholders::_1)) == l.end() 您看到的错误与bind无关,它是(已弃用,将在下一版本的C++中删除)错误。使用mem\u fun包装指向成员函数的指针时,需要将指针传递给要在其上调用成员函数的实例 find\u if将取消对迭代器的引用,并将结果传递给它的
find_if(l.begin(), l.end(), bind([](Person& p) { return p.check(); }, std::placeholders::_1)) == l.end()
您看到的错误与
bind
无关,它是(已弃用,将在下一版本的C++中删除)错误。使用mem\u fun
包装指向成员函数的指针时,需要将指针传递给要在其上调用成员函数的实例
find\u if
将取消对迭代器的引用,并将结果传递给它的谓词,这意味着您正在尝试将Person&
而不是Person*
传递给mem\u fun\t
。如果要传递引用,请使用。因此,下面将编译
find_if(l.begin(), l.end(), bind(mem_fun_ref(&Person::check), std::placeholders::_1))
// ^^^^^^^^^^^
作为Barry,表达式中甚至不需要bind
,下面的代码也可以
find_if(l.begin(), l.end(), mem_fun_ref(&Person::check))
或者使用mem\u-fun
/mem\u-fun\u-ref
的C++11替换
最后,还可以使用lambda表达式
find_if(l.begin(), l.end(), [](Person& p) { return p.check(); })
您看到的错误与
bind
无关,它是(已弃用,将在下一版本的C++中删除)错误。使用mem\u fun
包装指向成员函数的指针时,需要将指针传递给要在其上调用成员函数的实例
find\u if
将取消对迭代器的引用,并将结果传递给它的谓词,这意味着您正在尝试将Person&
而不是Person*
传递给mem\u fun\t
。如果要传递引用,请使用。因此,下面将编译
find_if(l.begin(), l.end(), bind(mem_fun_ref(&Person::check), std::placeholders::_1))
// ^^^^^^^^^^^
作为Barry,表达式中甚至不需要bind
,下面的代码也可以
find_if(l.begin(), l.end(), mem_fun_ref(&Person::check))
或者使用mem\u-fun
/mem\u-fun\u-ref
的C++11替换
最后,还可以使用lambda表达式
find_if(l.begin(), l.end(), [](Person& p) { return p.check(); })
不起作用的原因是:
创建成员函数包装器对象,从模板参数推断目标类型。包装器对象需要一个指向T
类型的对象的指针,作为其操作符()的第一个参数
要完成同样的任务,您需要使用(无需bind
required):
但实际上,您应该更喜欢更通用的,这两种语言都可以使用,另外,在C++17中,前两种语言将被弃用:
函数模板std::mem_fn为指向成员的指针生成包装器对象,这些对象可以存储、复制和调用指向成员的指针调用std::mem\u fn
时,可以使用指向对象的引用和指针(包括智能指针)
同样,允许引用或指针:
如Callable中所述,当调用指向非静态成员的指针函数或指向非静态数据成员的指针时,第一个参数必须是指向将访问其成员的对象的引用或指针(可能包括智能指针,如std::shared_ptr
和std::unique_ptr
)
不起作用的原因是:
创建成员函数包装器对象,从模板参数推断目标类型。包装器对象需要一个指向T
类型的对象的指针,作为其操作符()的第一个参数
要完成同样的任务,您需要使用(无需bind
required):
但实际上,您应该更喜欢更通用的,这两种语言都可以使用,另外,在C++17中,前两种语言将被弃用:
函数模板std::mem_fn为指向成员的指针生成包装器对象,这些对象可以存储、复制和调用指向成员的指针调用std::mem\u fn
时,可以使用指向对象的引用和指针(包括智能指针)
同样,允许引用或指针:
如Callable中所述,当调用指向非静态成员的指针函数或指向非静态数据成员的指针时,第一个参数必须是指向将访问其成员的对象的引用或指针(可能包括智能指针,如std::shared_ptr
和std::unique_ptr
)
如果您可以使用lambda,请直接使用它:find_If(l.begin(),l.end(),[](Person&p){return p.check();})
这很酷。是的,简单多了。谢谢@Jarod42If您可以使用lambda,直接使用它:find_if(l.begin(),l.end(),[](Person&p){return p.check();})
太酷了。是的,简单多了。谢谢@jarod42谢谢,我完全忘记了mem_fun_ref.我还没听说过mem_fn。太棒了!谢谢你,巴里!他也可以直接使用lambda。@0x499602D2是的,他可以,在这种情况下,mem\u fn
没有那么冗长。mem\u fun
等在C++*11*中被弃用,在C++17中将完全消失。谢谢你,我完全忘记了mem\u fun\u ref。我还没有听说过mem\u fn。太棒了!谢谢你,巴里!他也可以直接使用lambda。@0x499602D2是的,他可以,在这种情况下,mem\u fn
不那么冗长。mem\u fun
等在C++*11*中被弃用,在C++17中将完全消失。他也可以直接使用lambda。@0x499602D2当然,已更新。但当lambda更详细时,这是一种罕见的情况。他也可以直接使用lambda。@0x499602D2当然,已更新。但当lambda更详细时,这是罕见的情况之一。