Как это происходит (я полагаю) оставлено неопределенным (но у меня нет копии стандарта здесь).
Но, учитывая все различные возможности, которые необходимо охватить, у меня есть ощущение, что расшифровать точное определение того, как это работает, будет очень сложно: поэтому я не буду пытаться.
НоЯ думаю, вы хотели бы знать, как работают функторы, и они относительно просты.Итак, вот краткий пример.
Функторы:
Это объекты, которые действуют как функции.
Они очень полезны в коде шаблона, поскольку они часто позволяют использовать объекты или функции взаимозаменяемо,Самое замечательное в функторах - то, что они могут хранить состояние (своего рода закрытие бедняков).
struct X
{
int operator()(int x) { return doStuff(x+1);}
int doStuff(int x) { return x+1;}
};
X x; // You can now use x like a function
int a = x(5);
Вы можете использовать тот факт, что функтор хранит состояние для хранения таких вещей, как параметры, объекты или указательк элементам-методам (или любой их комбинации).
struct Y // Hold a member function pointer
{
int (X::*member)(int x);
int operator(X* obj, int param) { return (obj->*member)(param);}
};
X x;
Y y;
y.member = &X::doStuff;
int a = y(&x,5);
Или даже пойти дальше и связать параметры.Теперь все, что вам нужно предоставить, это один из параметров.
struct Z
{
int (X::*member)(int x);
int param;
Z(int (X::*m)(int), int p) : member(m), param(p) {}
int operator()(X* obj) { return (obj->*member)(param);}
int operator()(X& obj) { return (obj.*member)(param);}
};
Z z(&X::doStuff,5);
X x;
int a = z(x);