Здравствуйте, -MyXa-, Вы писали:
MX>По-этому так можно:
Причём, TMethod может быть и не указателем на функцию-член, но и
— указателем на член-данное, для типа которого определён оператор ()
— произвольным типом, для которого перегружен оператор ->*, для результата которого определён оператор ()
http://codepad.org/svJSx0Jl
#define CPFE cout << __PRETTY_FUNCTION__ << endl;
template<class X, class Y>
void foo(X x, Y y)
{
CPFE;
(x->*y)();
cout << endl;
}
struct H
{
void operator() () const { CPFE; }
};
struct I {};
struct J {};
struct A
{
void f() { CPFE; } // функция-член
void (*g)(); // указатель на свободную функцию
H h; // указатель на функциональный объект
};
H operator ->* (A* a, I i) { CPFE; return H(); } // I в роли указателя на член
H operator ->* (A& a, J j) { CPFE; return H(); } // внезапно, A в роли указателя на непойми что!
void ag() { CPFE; }
int main()
{
A a; a.g = ag;
foo(&a, &A::f);
foo(&a, &A::g);
foo(&a, &A::h);
foo(&a, I());
foo( a, J());
}
Но это немножко не то. У топикстартера — на выходе унарная функция, принимающая только объект. То есть, это биндер времени компиляции.
А биндер времени исполнения — это любой дурак может. Хоть руками, хоть на бусте...
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>