Вы не можете передать функцию, которая принимает два аргумента, в место, которое ожидает функцию, которая принимает один.Не может быть сделано, забудьте об этом, период, конец истории.Вызывающая сторона передает один аргумент вашей функции.Он не знает о втором аргументе, он не передает его вашей функции, вы не можете заставить его делать то, что вы хотите, как бы вы ни старались.
По той же причине вы не можете передать нестатическую функцию-член, где ожидается обычная функция.Функция-член нуждается в объекте для работы.Какой бы код ни вызывал вашу функцию, он не знает об объекте, нет способа передать ему объект, и нет способа заставить его использовать правильную последовательность вызова, которая учитывает объект.
Интерфейсы, которые принимаютФункции пользователя, не принимая дополнительных данных, которые пользователь может захотеть передать своей функции, по своей сути злые.Посмотрите на функцию qsort()
из стандартной библиотеки C.Это пример злого интерфейса.Предположим, вы хотите отсортировать массив строк в соответствии с определенной схемой сопоставления, определенной извне.Но он принимает только функцию сравнения, которая принимает два значения.Как передать эту схему сопоставления в функцию сравнения?Вы не можете, и поэтому, если вы хотите, чтобы это работало, вы должны использовать злую глобальную переменную со всеми присоединенными к ней строками.
Именно поэтому C ++ отошел от передачи указателей на функции и к функциональные объекты .Объекты функций могут инкапсулировать любые данные, которые вы хотите.