#include <iostream>
struct Extension
{
void f(){std::cout<<"f"<<std::endl;}
float g(int x, float y, int z)
{
std::cout << "x = " << x << std::endl
<< "y = " << y << std::endl
<< "z = " << z << std::endl;
return 4.5f;
}
};
template<typename R, typename... Args>
R CallExtMF(Extension &ext, void *f, Args... args)
{
R (Extension::*mfp)(Args...) = *reinterpret_cast<R (Extension::**)(Args...)>(&f);
return (ext.*mfp)(args...);
}
int main()
{
void *f = reinterpret_cast<void *>(&Extension::f);
void *g = reinterpret_cast<void *>(&Extension::g);
Extension e;
CallExtMF<void>(e, f);
float p = 2.5f;
float rv = CallExtMF<float>(e, g, 1, *reinterpret_cast<int *>(&p), 3);
std::cout << "rv = " << rv << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEV4dGVuc2lvbgp7Cgl2b2lkIGYoKXtzdGQ6OmNvdXQ8PCJmIjw8c3RkOjplbmRsO30KCWZsb2F0IGcoaW50IHgsIGZsb2F0IHksIGludCB6KQoJewoJCXN0ZDo6Y291dCA8PCAieCA9ICIgPDwgeCA8PCBzdGQ6OmVuZGwKCQkgICAgICAgICAgPDwgInkgPSAiIDw8IHkgPDwgc3RkOjplbmRsCgkJICAgICAgICAgIDw8ICJ6ID0gIiA8PCB6IDw8IHN0ZDo6ZW5kbDsKCQlyZXR1cm4gNC41ZjsKCX0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEFyZ3M+ClIgQ2FsbEV4dE1GKEV4dGVuc2lvbiAmZXh0LCB2b2lkICpmLCBBcmdzLi4uIGFyZ3MpCnsKCVIgKEV4dGVuc2lvbjo6Km1mcCkoQXJncy4uLikgPSAqcmVpbnRlcnByZXRfY2FzdDxSIChFeHRlbnNpb246OioqKShBcmdzLi4uKT4oJmYpOwoJcmV0dXJuIChleHQuKm1mcCkoYXJncy4uLik7Cn0KCmludCBtYWluKCkKewoJdm9pZCAqZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPigmRXh0ZW5zaW9uOjpmKTsKCXZvaWQgKmcgPSByZWludGVycHJldF9jYXN0PHZvaWQgKj4oJkV4dGVuc2lvbjo6Zyk7CgkKCUV4dGVuc2lvbiBlOwoJCglDYWxsRXh0TUY8dm9pZD4oZSwgZik7CglmbG9hdCBwID0gMi41ZjsKCWZsb2F0IHJ2ID0gQ2FsbEV4dE1GPGZsb2F0PihlLCBnLCAxLCAqcmVpbnRlcnByZXRfY2FzdDxpbnQgKj4oJnApLCAzKTsKCXN0ZDo6Y291dCA8PCAicnYgPSAiIDw8IHJ2IDw8IHN0ZDo6ZW5kbDsKfQo=