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 ++ рекомендуется использовать лямбды-скобки, если это возможно. Он часто более читабелен и, возможно, даже быстрее, потому что компилятору легче оптимизировать, например, путем встраивания вызываемой функции. Но это зависит от точного кода и компилятора.