仅此而已,我想使用index = []
for i, x in enumerate(lst):
if x > 0:
index.append(i)
print index
语句内的lambda表达式返回true
或false
。我看到这个问题与我的问题类似:LINK,但找不到答案。
这是我的示例代码:
if()
当我尝试编译时,出现此错误:
if([&rel_pose](Eigen::VectorXd pose)
{
return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
}) // do smth
好吧,读取错误我以为我没有调用该函数,因为编译器未将表达式视为bool。所以我尝试使用此代码:
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’
})
错误:
if(([&rel_pose](Eigen::VectorXd pose)
{
return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
};)) // do smth
这似乎是一个明显的错误,但对我来说,我可能不正确地理解语法,并想问发生了什么事。
编辑: 请注意,我已经简化了代码,因此您可以轻松地复制错误。我知道在这种特殊情况下,lambda表达式没有任何意义。
答案 0 :(得分:7)
您忘了给您的lambda打电话。现在,您说的是if(function_pointer)
,因此编译器无法将其转换为布尔表达式。
一个简单的带有布尔lambda的if
子句因此写为:
if ([]() {
return true;
}()) {
//do sth
}
将变量作为参数同时捕获它也会导致错误。您必须决定,所以要么:
if([](Eigen::VectorXd pose)
{
return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
}(rel_pose)){
//do sth
}
或
if([&rel_pose]()
{
return (sqrt(rel_pose(0) * rel_pose(0) + rel_pose(1) * rel_pose(1)) < 2) ? true : false;
}()){
//do sth
}
在这种情况下,是否需要lambda是有问题的,您可以摆脱lamdba,而将if子句中的布尔表达式保留下来。在谈论它时-无需在此处使用三元运算符。 return sqrt(rel_pose(0) * rel_pose(0) + rel_pose(1) * rel_pose(1)) < 2;
就足够了,而且更具可读性。
答案 1 :(得分:3)
lambda是一个函数对象。您应该使用()
调用它。
if ([](Eigen::VectorXd pose)
{
return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
}(rel_pose)) { /* ... */ }
您传递rel_pose
作为参数而不是捕获它。
无论如何,您可能应该将pose
用作const
引用。
也就是说,我不知道您要在这里做什么。这样会更好:
if (sqrt(foo(0) * foo(0) + foo(1) * foo(1)) < 2) { /* ... */ }
答案 2 :(得分:3)
这是在定义带有捕获短语的lambda,而不是调用lambda
[&rel_pose](Eigen::VectorXd pose)
{
return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
}
如果要使用rel_pose作为参数调用lambda,
[](Eigen::VectorXd pose)
{
return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
}(rel_pose)
我认为这是对的