只是为了说明这一点,我想返回true或false使用if()语句内的lambda表达式。我看到了一个与我的问题类似的问题:LINK,但找不到答案。
所以这是我的示例代码:
if([&rel_pose](Eigen::VectorXd pose)
{
return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
}) // do smth
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,出现以下错误:
error: could not convert ‘<lambda closure object>graphslam::GraphSLAM::main_pose_callback(const ConstPtr&)::<lambda(Eigen::VectorXd)>{rel_pose}’ from ‘graphslam::GraphSLAM::main_pose_callback(const ConstPtr&)::<lambda(Eigen::VectorXd)>’ to ‘bool’
})
Run Code Online (Sandbox Code Playgroud)
好的,阅读错误我以为我没有调用函数,因为编译器不会将表达式视为bool。所以我尝试使用此代码:
if(([&rel_pose](Eigen::VectorXd pose)
{
return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
};)) // do smth
Run Code Online (Sandbox Code Playgroud)
错误:
expected ‘)’ before ‘;’ token
};)) return;
Run Code Online (Sandbox Code Playgroud)
这看起来似乎是一个明显的错误,但是对我来说,我可能不正确地理解语法,并想问发生了什么。
编辑:请注意,我已经简化了代码,因此您可以轻松地复制错误。我知道在这种特殊情况下,lambda表达式没有任何意义。
你忘了给你的lambda打电话。现在,您要说的if(function_pointer)是编译器无法将其转换为布尔表达式。
if因此,带有布尔型lambda的简单子句的编写方式如下:
if ([]() {
return true;
}()) {
//do sth
}
Run Code Online (Sandbox Code Playgroud)
通过在捕获变量的同时将其作为参数也可能会导致错误。您必须决定,因此:
if([](Eigen::VectorXd pose)
{
return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
}(rel_pose)){
//do sth
}
Run Code Online (Sandbox Code Playgroud)
要么
if([&rel_pose]()
{
return (sqrt(rel_pose(0) * rel_pose(0) + rel_pose(1) * rel_pose(1)) < 2) ? true : false;
}()){
//do sth
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,是否需要lambda是有问题的,您可以摆脱lamdba,将布尔表达式留在if子句中。在谈论它时-无需在此处使用三元运算符。return sqrt(rel_pose(0) * rel_pose(0) + rel_pose(1) * rel_pose(1)) < 2;足够并且更具可读性。