Лучшим типом для вашей переменной myFunc
будет boost::function<void()>
, поскольку со всеми аргументами исходной привязки func
на самом деле не требуется никаких аргументов для вызова полученной оболочки.
boost::function<void()> myFunc = boost::bind(&func, &myInt1);
Это фактически позволит вам вызывать функцию с помощью:
myFunc();
Но причина, по которой компилятор допустил тип boost::function<void(void*)>
, заключается в том, что результат вызова boost::bind
может быть вызванс большим количеством аргументов, чем необходимо, если вы решите, и дополнительные аргументы просто игнорируются.Это делает некоторые ситуации более последовательными:
void f(int, int);
// g1 acts the same as f:
boost::function<void(int, int)> g1 = boost::bind(f, _1, _2);
// g2 swaps the order of arguments when calling f:
boost::function<void(int, int)> g2 = boost::bind(f, _2, _1);
// g3 ignores its first argument and passes the second to f twice:
boost::function<void(int, int)> g3 = boost::bind(f, _2, _2);
// g4 ignores its second argument and passes the first to f twice:
boost::function<void(int, int)> g4 = boost::bind(f, _1, _1);
При инициализации g4
мы можем сказать, что выражение bind
- это просто еще одна связанная функция, которую можно вызывать ровно с двумяint
аргументов, потому что он не использует никаких заполнителей с позицией больше 2. Его также можно вызывать только с одним аргументом, так как сам _2
также никогда не используется, но это не делает вышеприведенное ложным.
Аналогично, в вашем коде, инициализирующем boost::function<void(void*)>
, компилятор принимает полностью связанное выражение bind
как что-то, что может быть достоверно вызвано с одним аргументом, так как он не использует заполнители с положением, большим чем1. Хотя на самом деле он не использует заполнитель _1
с позицией ровно 1, ввод void*
при таком использовании просто игнорируется.