Как boost :: bind передает аргументы в C ++? - PullRequest
0 голосов
/ 05 марта 2020

У меня проблемы с пониманием некоторых частей этих строк кода:

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)

Спасибо

Ответы [ 2 ]

1 голос
/ 05 марта 2020

boost::bind, или в настоящее время std::bind, используется для привязки некоторых аргументов к функции. В результате получается функция, которая принимает меньше аргументов (и возвращает одно и то же).

Строка кода в вашем примере в основном эквивалентна:

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

Аргументы bind являются функцией, которую вы хотите вызвать, за которой следуют все аргументы функции. Вы можете установить для них фиксированные значения или использовать заполнители _1, _2 et c. чтобы оставить их пока и передавать их при вызове результирующей функции. Таким образом, получающаяся функция ожидает столько же аргументов, сколько и количество заполнителей, которые вы используете. Вы также можете указать их в другом порядке, чтобы изменить порядок аргументов.

Для функций-членов их неявным первым аргументом является указатель this, поэтому здесь вторым аргументом bind является объект, для которого вызывается функция.

В вашем примере Ожидается, что функция обратного вызова, переданная в setFromIK, будет принимать три параметра, но у авторов есть только более общая функция, которая принимает пять (this и world являются дополнительными.) Таким образом, они делают более конкретным c функция из этой общей функции, для которой два параметра уже фиксированы. Это называется Curry .

Обратите внимание, что в Основных рекомендациях C ++ рекомендуется использовать лямбды-скобки, если это возможно. Он часто более читабелен и, возможно, даже быстрее, потому что компилятору легче оптимизировать, например, путем встраивания вызываемой функции. Но это зависит от точного кода и компилятора.

0 голосов
/ 05 марта 2020

boost::bind дает вам функцию, которая отображает свои аргументы для вызова другой функции, а затем, по желанию, добавляет те, которые она уже знает. Теперь это часть стандарта, поэтому вы можете прочитать больше на cppreference .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...