我有以下程序使用带有lambda函数的ptr_fun。
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
int main()
{
string target="aa";
vector<string> v1;
v1.push_back("aa");
v1.push_back("bb");
auto stringcasecmp=[](string lhs, string rhs)->int
{
return strcasecmp(lhs.c_str(), rhs.c_str());
};
auto pos = find_if(
v1.begin(), v1.end(),
not1( bind2nd(ptr_fun(stringcasecmp), target) )
);
if ( pos != v1.end())
cout << "The search for `" << target << "' was successful.\n"
"The next string is: `" << pos[1] << "'.\n";
}
我收到以下错误消息。
stackoverflow.cpp: In function ‘int main()’:
stackoverflow.cpp:21:41: error: no matching function for call to ‘ptr_fun(main()::<lambda(std::string, std::string)>&)’
stackoverflow.cpp:22:6: error: unable to deduce ‘auto’ from ‘<expression error>’
如何修改代码(最低限度)以使其编译?
答案 0 :(得分:9)
bind2nd
(§D.9)和ptr_fun
(§D.8.2.1)在C ++ 11中已弃用。你可以在find_if
中编写另一个lambda函数:
auto pos = find_if(v1.begin(), v1.end(),
[&](const std::string& s) {
return !stringcasecmp(s, target);
});
ptr_fun(<lambda>)
将不起作用,因为ptr_fun
是为C ++ 03设计的,用于将函数指针转换为其他适配器的函数对象。 lambda已经是一个函数对象,因此ptr_fun
是不必要的。
bind2nd
期望函数对象定义成员second_argument_type
和result_type
,这对于lambda是不正确的,因此编写bind2nd(<lambda>, target)
也不起作用。但是在C ++ 11中有一个有效的通用替代品:
std::bind(stringcasecmp, std::placeholders::_1, target)
但是,bind
不会返回not1
所期望的C ++ 03样式的函数对象:它需要bind
的结果类型来定义{{1}不存在的成员。因此最后的表达
argument_type
将不工作。最简单的解决方法是使用我上面写的另一个lambda。
或者,您可以定义一个通用的否定符:
std::not1(std::bind(stringcasecmp, std::placeholders::_1, target))
答案 1 :(得分:0)
请尝试pointer_to_binary_function<string,string,int>(stringcasecmp)
而不是ptr_fun(stringcasecmp)
?