我有一个案例,我可以将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似乎是未定义的,就好像它一样是一个超出范围的局部变量。
目前我可以通过失去一些通用性来获得相同的功能,但我想知道是否有办法完成我想要做的事情。
答案 0 :(得分: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]
。