0

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

这有效:

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 似乎是未定义的,就好像它是本地的超出范围的变量。

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

4

1 回答 1

1

Func是本地的ReturnGeneralPred,当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]

于 2013-12-30T11:01:07.757 回答