【问题标题】:returning a std::function wrapped lambda that invokes a specified pointer to member function返回一个 std::function 包装的 lambda,它调用指向成员函数的指定指针
【发布时间】:2013-12-30 10:37:19
【问题描述】:

我有一个案例,我可以将一个 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 似乎是未定义的,就好像它是一个超出范围的局部变量。

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

【问题讨论】:

  • 尝试通过值而不是通过引用来捕获本地Func
  • “Func 似乎是未定义的,好像它是一个超出范围的局部变量。”。考虑到唯一明显的问题已经得到解答,我几乎想以“缺少一个实际问题”来结束它。
  • 我没有完全理解它不会存储它可以通过引用看到的指针以供以后使用的事实,但无论如何这在功能上都是一个指针副本,所以下面的答案是有意义的我现在。谢谢=)

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


【解决方案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]

【讨论】:

    猜你喜欢
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    相关资源
    最近更新 更多