boost::bind 如何在 C++ 中传递参数?
How does boost::bind pass arguments in C++?
我无法理解这些代码行的某些部分:
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)
谢谢
boost::bind
为您提供一个函数,该函数映射其参数以调用另一个函数,然后可选择添加一些它已知的参数。它现在是标准的一部分,因此您可以在 cppreference.
阅读更多内容
boost::bind
,或现在的std::bind
,用于绑定一些参数到一个函数。结果是一个参数更少的函数(和 returns 一样)。
您示例中的代码行基本上等同于:
const auto fn_ = [this, &world](auto&& arg1, auto&& arg2, auto&& arg3) {
return checkFeasibility(&world, arg1, arg2, arg3);
};
bind
的参数是您要调用的函数,后面是函数的所有参数。您可以将它们设置为固定值或使用占位符 _1
、_2
等暂时将它们保留在外面,并在调用结果函数时传递它们。因此,生成的函数期望的参数数量与您使用的占位符数量完全一样。您还可以以不同的顺序指定它们以重新排序参数。
对于成员函数,它们隐含的第一个参数是 this
指针,所以这里 bind
的第二个参数是调用函数的对象。
在您的示例中,传递给 setFromIK
的回调函数应采用三个参数,但作者只有一个更通用的函数,它采用五个参数(this
和 world
是额外的。)所以他们从这个已经固定了两个参数的通用函数中创建了一个更具体的函数。这称为 Currying.
请注意,如果可能,C++ 核心指南建议使用 lambda 而不是绑定。它通常更具可读性,甚至可能更快,因为编译器更容易优化,例如通过内联被调用的函数。但这取决于确切的代码和编译器。
我无法理解这些代码行的某些部分:
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)
谢谢
boost::bind
为您提供一个函数,该函数映射其参数以调用另一个函数,然后可选择添加一些它已知的参数。它现在是标准的一部分,因此您可以在 cppreference.
boost::bind
,或现在的std::bind
,用于绑定一些参数到一个函数。结果是一个参数更少的函数(和 returns 一样)。
您示例中的代码行基本上等同于:
const auto fn_ = [this, &world](auto&& arg1, auto&& arg2, auto&& arg3) {
return checkFeasibility(&world, arg1, arg2, arg3);
};
bind
的参数是您要调用的函数,后面是函数的所有参数。您可以将它们设置为固定值或使用占位符 _1
、_2
等暂时将它们保留在外面,并在调用结果函数时传递它们。因此,生成的函数期望的参数数量与您使用的占位符数量完全一样。您还可以以不同的顺序指定它们以重新排序参数。
对于成员函数,它们隐含的第一个参数是 this
指针,所以这里 bind
的第二个参数是调用函数的对象。
在您的示例中,传递给 setFromIK
的回调函数应采用三个参数,但作者只有一个更通用的函数,它采用五个参数(this
和 world
是额外的。)所以他们从这个已经固定了两个参数的通用函数中创建了一个更具体的函数。这称为 Currying.
请注意,如果可能,C++ 核心指南建议使用 lambda 而不是绑定。它通常更具可读性,甚至可能更快,因为编译器更容易优化,例如通过内联被调用的函数。但这取决于确切的代码和编译器。