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

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

===============>>#1 票数:9 已采纳

在C ++ 11中不推荐使用bind2nd (§D.9)和ptr_fun (§D.8.2.1)。 你可以在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不会返回C ++ 03样式的函数对象,而not1期望它:它需要bind的结果类型来定义不存在的argument_type成员。 因此最后的表达

std::not1(std::bind(stringcasecmp, std::placeholders::_1, target))

不行 最简单的解决方法是使用我上面写的另一个lambda。

或者,您可以定义一个通用的否定符:

template <typename Predicate>
struct generic_negate
{
    explicit generic_negate(Predicate pred) : _pred(pred) {}

    template <typename... Args>
    bool operator()(Args&&... args)
    {
        return !_pred(std::forward<Args>(args)...);
    }
private:
    Predicate _pred;
};

template <class Predicate>
generic_negate<Predicate> not_(Predicate pred)
{
    return generic_negate<Predicate>(pred);
}

....

auto pos = find_if(v1.begin(), v1.end(), not_(bind(stringcasecmp, _1, target)));

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

===============>>#2 票数:0

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

  ask by ggg translate from so

未解决问题?本站智能推荐:

2回复

如何用std :: function和std :: ref替换std :: ptr_fun

我正在尝试学习C ++ 11的新功能,我有这个代码: 输出: 关于ptr_fun, 这个网站说: 有人可以在没有ptr_fun和C ++ 11推荐的函数的情况下重写上面的例子吗? 谢谢
2回复

使用std :: ptr_fun作为成员函数

考虑以下: 上面的代码无法否定is_odd()的影响,因为它是一个成员函数。 对std::ptr_fun()的调用失败。 我该如何使它工作? 请注意,我希望is_odd()是一个非静态成员函数。
1回复

不能将std :: ptr_fun与带参考的函数一起使用

不允许使用C ++ 11或Boost。 我试图让以下代码编译,但我遇到了问题。 std::ptr_fun似乎不喜欢引用的参数。 VS2013错误消息:错误C2535:'Something std :: binder2nd> :: operator()(const Somet
1回复

C ++ ptr_fun没有找到void参数化函数

我尝试使用std :: ptr_fun来包装我的函数,但是当我尝试用void参数和bool返回类型包装函数时,我最终得到一个错误: 码: 功能: 错误: 错误:没有匹配函数来调用'ptr_fun(bool(*)())' 但每当我将参数更改为int时,问题似
1回复

带有unique_ptr捕获的asio lambda

我正在使用asio独立1.10.6和vs2015 rc。 vs2015支持unique_ptr捕获。 所以我写了一些代码如下: 但是当我编译代码时,编译器说: 错误C2280:....试图引用已删除的函数 据我所知,它说我尝试复制lambda,因为lambda捕
1回复

lambda函数中的std :: unique_ptr导致分段错误

我有以下代码: 似乎当一个对象声明对现有unique_ptr的所有权并在lambda中使用该unique_ptr时,就会发生分段错误。 为什么在这种特定情况下会发生分段错误? 无论如何,在所有权已转让的Lambda中使用unique_ptr? 非常感谢你!
1回复

我应该使用const shared_ptr吗 &或shared_ptr 作为我的lambda函数的参数?

我看过一个C ++ 11库,该库通过网络接收视频数据包,并且为了决定如何处理这些数据包,它使用了如下lambda函数: 其中Frame::Ptr只是shared_ptr<Frame> 。 我不喜欢接收对shared_ptr的引用的想法。 对我来说, shared_ptr始
2回复

返回带有函数捕获的lambda

在C ++ 11中,可以编写带有捕获的lambda(这太棒了!) 太棒了! 但是,如果一个人可以从一个函数甚至从另一个lambda返回这样的lambda,那就太好了。 这有可能吗?
3回复

带有lambda自定义删除程序的std :: unique_ptr无法编译

在以下代码中找不到什么问题 CFStringCreateWithCString应该根据CFStringCreateWithCString文档返回正确的类型 错误:
4回复

C ++中的性能比较(正常函数调用vs for_each + mem_fun vs lambda表达式)

在这些片段中,哪一个是最佳的(性能)? 1) 2) 3)