Подтвердить что ты не робот

Почему объекты, возвращенные из bind, игнорируют дополнительные аргументы?

Предположим, что у меня есть функция, которая принимает два аргумента,

void f(int x, int y);

и я хочу связать один из них. Я могу использовать std::bind следующим образом:

auto partiallyBoundF = std::bind(f, 10, _1);

partiallyBoundF принимает только один аргумент, но я могу назвать его более чем одним. Аргументы, выходящие за пределы первого, даже не должны иметь тип, который имеет какой-либо смысл:

partiallyBoundF(20, 0);
partiallyBoundF(0, 44, -99, "Hello", 4.5, true, []{});

Какова цель разрешения объектов, возвращаемых из bind, передавать дополнительные аргументы? Он позволяет вызывать ошибки для компиляции, которые будут отклонены в любом месте.

4b9b3361

Ответ 1

Игнорирование дополнительных аргументов намного проще для реализации и может быть полезно.

В типичной реализации, например, libstdС++ (g++), принятый подход состоит в том, чтобы собрать аргументы operator() в кортеж, а затем позволить аргументам привязки std::placeholder извлекать их по мере необходимости. Принудительный подсчет аргументов потребует подсчета количества используемых заполнителей, что было бы довольно сложно. Обратите внимание, что вызываемый bind может быть функтором с несколькими шаблонами шаблонов operator(), поэтому объект привязки operator() не может быть сгенерирован с помощью одной "правильной" сигнатуры.

Также обратите внимание, что вы можете написать:

std::bind(&foo, std::placeholders::_1, std::placeholders::_3);

то есть. явно игнорируя второй аргумент для объекта bind. Если bind применяет счетчик аргументов, вам понадобится дополнительный способ указать, например, четвертый аргумент также следует игнорировать.

Что касается полезности, рассмотрите привязку обработчика сигнала элемента к сигналу:

sig.connect(std::bind(&C::on_sig, this, param, std::placeholders::_1));

Если sig имеет дополнительные параметры нежелательного излучения, то они просто игнорируются объектом bind; в противном случае привязка одного и того же обработчика к нескольким сигналам потребует написания нескольких оберток пересылки для реальной цели.