Здравствуйте, Аноним, Вы писали:
А мы так:
A::f<D, static_cast<void (D::*)(void)>(&D::f)>(&d);
Оказывается, выражение &D::f имеет тип void (B::*)(void), а компилятор по чём зря не будет кастить
шаблонный параметр void (B::*)(void) в void (D::*)(void) (не шаблонные, конечно, кастятся).
По-этому так можно:
struct A {
template< class T, class M>
static void f( T* obj, M TMethod ){
(obj->*TMethod)();
}
};
struct B {
void f() {
cout << "f()" << endl;
}
};
struct D : B {
};
int main() {
D d;
A::f<D>(&d, &D::f);
return 0;
}