带有lambda函数的ptr_fun

时间:2011-12-12 11:21:43

标签: c++ c++11

我有以下程序使用带有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>’

如何修改代码(最低限度)以使其编译?

2 个答案:

答案 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_typeresult_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))

示例:http://ideone.com/6dktf

答案 1 :(得分:0)

请尝试pointer_to_binary_function<string,string,int>(stringcasecmp)而不是ptr_fun(stringcasecmp)