【问题标题】:How does boost::bind pass arguments in C++?boost::bind 如何在 C++ 中传递参数?
【发布时间】:2020-03-04 21:42:10
【问题描述】:

我无法理解这些代码行的某些部分:

fn_ = boost::bind(&CheckFeasibility, this, &world_, _1, _2, _3 );

if (robot_state_->setFromIK(arg1, arg2, arg3, arg4, arg5, fn_ ))

第一行中this 的用途是什么?CheckFeasibility 的参数何时以及如何确定并传递给它?

这是CheckFeasibility 函数的样子(我省略了参数的数据类型):

bool CheckFeasibility(*world, *state, *grp, *values)

谢谢

【问题讨论】:

标签: c++ boost-bind


【解决方案1】:

boost::bind,或者现在的std::bind,用于绑定函数的一些参数。结果是一个接受更少参数的函数(并返回相同的东西)。

您示例中的代码行基本上相当于:

const auto fn_ = [this, &world](auto&& arg1, auto&& arg2, auto&& arg3) {
  return checkFeasibility(&world, arg1, arg2, arg3);
};

bind 的参数是您要调用的函数,后跟该函数的所有参数。您可以将它们设置为固定值或使用占位符_1_2 等暂时将它们排除在外,并在调用结果函数时传递它们。因此,生成的函数需要与您使用的占位符数量完全相同的参数。您还可以以不同的顺序指定它们以重新排序参数。

对于成员函数,它们隐含的第一个参数是this 指针,所以这里bind 的第二个参数是调用函数的对象。

在您的示例中,传递给 setFromIK 的回调函数预计需要三个参数,但作者只有一个更通用的函数,需要五个参数(thisworld 是额外的。)所以他们从这个通用函数中创建一个更具体的函数,其中两个参数已经固定。这称为柯里化

请注意,如果可能,C++ 核心指南建议使用 lambdas 而不是绑定。它通常更具可读性,甚至可能更快,因为编译器更容易优化,例如通过内联被调用的函数。但这取决于确切的代码和编译器。

【讨论】:

  • 谢谢!那么,*state*grp*values 的值是在什么时候确定的?我没有看到它们在代码中的任何地方创建或分配,它们在函数中使用。谢谢。
  • @bbaalleerr22 它们在调用fn_ 的地方传递,所以寻找fn_(..., ..., ...)
  • @bbaalleerr22 • 对于现代 C++(C++11 及更高版本),我的建议是使用 lambdas 和/或 lambdas-with-closures 而不是 bind
  • setFromIK 接受一个参数const GroupStateValidityCallbackFn& constraint,为此您将fn_ 作为参数传入。 constraint 实际上在这个文件的 3 个地方被调用,例如在setFromIKSubgroups.
  • Nitpick:从 bind 返回的函数可以使用任意数量 > 3 的参数调用,因此它更等同于 [this, &world](auto&& arg1, auto&& arg2, auto&& arg3, auto...){ return checkFeasibility(&world, arg1, arg2, arg3); }
【解决方案2】:

boost::bind 为您提供了一个函数,该函数将其参数映射到调用另一个函数,然后可选地添加一些它已经知道的函数。它现在是标准的一部分,因此您可以在cppreference 阅读更多内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 2013-11-12
    • 1970-01-01
    相关资源
    最近更新 更多