Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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更详细时,这是罕见的情况之一。