Следующее:
#include <functional>
struct Foo
{
void bar1() {}
void bar2(int) {}
void bar3(int, int) {}
void bar4(int, int, int) {}
};
int main()
{
Foo foo;
auto f1 = std::bind(&Foo::bar1, &foo);
auto f2 = std::bind(&Foo::bar2, &foo);
auto f3 = std::bind(&Foo::bar3, &foo);
auto f4 = std::bind(&Foo::bar4, &foo);
f1(1, 2, 3, 4); // success
f2(1, 2, 3); // error
f3(1, 2); // error
f4(1); // error
return 0;
}
f1 (1, 2, 3, 4) компилирует и выполняет bar1(). f2 (1, 2, 3), не компилируется, f3 (1, 2) не компилируется (но bar3 имеет правильный прототип), а f4 (1) не компилируется. Ошибка, которую я получаю с Visual Studio 2013 для этих трех случаев, -
"класс не определяет" operator() "или пользовательский оператор преобразования к указателю на функцию или ссылку на функцию, которая принимает соответствующее количество аргументов"
У меня ограниченное понимание шаблонов и стандартной библиотеки, но это, похоже, не имеет для меня никакого логического смысла. Есть ли достаточно простое объяснение?