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