#include <iostream>
template<typename T, typename className, typename... _Args>
struct RuntimeClass
{
T (className::*m_pfnFunction)(_Args... __args);
};
#define DECL_RUNTIMECLASS(T, className, ...) \
static RuntimeClass<T, className, __VA_ARGS__> class_##className;
#define IMPL_RUNTIMECLASS(T, className, pfnFunc, ...) \
RuntimeClass<T, className, __VA_ARGS__> className::class_##className = { (pfnFunc) };
class TestClass
{
public:
int TestFunc(int v);
DECL_RUNTIMECLASS(int, TestClass, int)
};
int TestClass::TestFunc(int v)
{
return v;
}
IMPL_RUNTIMECLASS(int, TestClass, &TestClass::TestFunc, int)
int main()
{
TestClass b;
std::cout<<(b.*b.class_TestClass.m_pfnFunction)(42)<<std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgY2xhc3NOYW1lLCB0eXBlbmFtZS4uLiBfQXJncz4Kc3RydWN0IFJ1bnRpbWVDbGFzcwp7CiAgIFQgKGNsYXNzTmFtZTo6Km1fcGZuRnVuY3Rpb24pKF9BcmdzLi4uIF9fYXJncyk7Cn07CgojZGVmaW5lIERFQ0xfUlVOVElNRUNMQVNTKFQsIGNsYXNzTmFtZSwgLi4uKSBcCiAgIHN0YXRpYyBSdW50aW1lQ2xhc3M8VCwgY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXz4gY2xhc3NfIyNjbGFzc05hbWU7CgojZGVmaW5lIElNUExfUlVOVElNRUNMQVNTKFQsIGNsYXNzTmFtZSwgcGZuRnVuYywgLi4uKSBcClJ1bnRpbWVDbGFzczxULCBjbGFzc05hbWUsIF9fVkFfQVJHU19fPiBjbGFzc05hbWU6OmNsYXNzXyMjY2xhc3NOYW1lID0geyAocGZuRnVuYykgfTsKCmNsYXNzIFRlc3RDbGFzcwp7CnB1YmxpYzoKICAgaW50IFRlc3RGdW5jKGludCB2KTsKICAgREVDTF9SVU5USU1FQ0xBU1MoaW50LCBUZXN0Q2xhc3MsIGludCkKfTsKCmludCBUZXN0Q2xhc3M6OlRlc3RGdW5jKGludCB2KQp7CiAgIHJldHVybiB2Owp9CgpJTVBMX1JVTlRJTUVDTEFTUyhpbnQsIFRlc3RDbGFzcywgJlRlc3RDbGFzczo6VGVzdEZ1bmMsIGludCkKCmludCBtYWluKCkKewoKICAgVGVzdENsYXNzIGI7CiAgIHN0ZDo6Y291dDw8KGIuKmIuY2xhc3NfVGVzdENsYXNzLm1fcGZuRnVuY3Rpb24pKDQyKTw8c3RkOjplbmRsOwp9