Lambda表达式可在if语句中返回布尔值

时间:2019-05-24 08:37:50

标签: c++ lambda c++14

仅此而已,我想使用index = [] for i, x in enumerate(lst): if x > 0: index.append(i) print index 语句内的lambda表达式返回truefalse。我看到这个问题与我的问题类似: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表达式没有任何意义。

3 个答案:

答案 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)

我认为这是对的