返回一个std :: function wrapped lambda,它调用指向成员函数的指定指针

时间:2013-12-30 10:37:19

标签: c++ lambda generic-programming pointer-to-member

我有一个案例,我可以将lambda传递给std :: sort,我也可以通过调用一个返回std :: function的函数来提供谓词,该函数包装同一个lambda,但是,如果我尝试调用一个类似的函数,它允许我指定一个指向成员函数的指针,这个编译但在运行时失败。

这有效:

std::sort(myContainer.begin(), myContainer.end(), [&](type lhs, type rhs)
{
    return MyMemberFunction(lhs, rhs);
});

这有效:

std::function<bool(type,type)> ReturnPred()
{
    std::function<bool(type,type)> pred = [&](type lhs, type rhs)
    {
        return MyMemberFunction(lhs, rhs);
    };
    return pred;
}

std::sort(myContainer.begin(), myContainer.end(), ReturnPred());

但这不起作用:

std::function<bool(type,type)> ReturnGeneralPred(
     bool(MyClass::Func*)(type lhs, type rhs))
{
    std::function<bool(type,type)> pred = [&](type lhs, type rhs)
    {
        return (this->*Func)(lhs, rhs);
    };
    return pred;
}

std::function<bool(type,type)> ReturnThisPred()
{
    return ReturnGeneralPred(&MyClass::MyMemberFunction);
}

std::sort(myContainer.begin(), myContainer.end(), ReturnThisPred());

当我尝试这最后的通用方法时,我逐步完成调试器,当std :: sort调用谓词时,它会进入我上面调用的ReturnGeneralPred,而Func似乎是未定义的,就好像它一样是一个超出范围的局部变量。

目前我可以通过失去一些通用性来获得相同的功能,但我想知道是否有办法完成我想要做的事情。

1 个答案:

答案 0 :(得分:1)

FuncReturnGeneralPred的本地,当Func超出其范围(悬空指针)时使用lambda。
通过副本捕获Func可以解决您的问题:

std::function<bool(type,type)> ReturnGeneralPred(bool(MyClass::Func*)(type lhs, type rhs))
{
    std::function<bool(type,type)> pred = [this, Func](type lhs, type rhs)
    {
        return (this->*Func)(lhs, rhs);
    };
    return pred;
}

或使用[=]语法代替显式捕获[this, Func]