#include <iostream>
struct lua_State {};
template<typename T>
T CheckLuaValue( int n, lua_State* l)
{
std::cout << "arg[" << n << "] gotten\n";
return T(n);
}
template<int ...>
struct seq { };
template<int First, int Last>
struct gen_seq
{
template<int N, int... S>
struct helper : helper<N-1, N-1, S...> {};
template<int... S>
struct helper<First, S...> {
typedef seq<S...> type;
};
typedef typename helper<Last>::type type;
};
template< typename X >
struct MemberFunctionWrapper;
template< typename F >
struct MemberFunctionHelper
{
typedef F MethodPtr;
};
template<class InstanceType, typename ReturnType, typename... Params>
struct MemberFunctionWrapper< ReturnType(InstanceType::*)(Params...) >
{
typedef MemberFunctionHelper<ReturnType(InstanceType::*)(Params...)> Helper;
typedef typename Helper::MethodPtr MethodPtr;
static MethodPtr& GetFunctionPointer() {static MethodPtr pFunc; return pFunc;}
static InstanceType*& GetMemberPointer() {static InstanceType* pThis;return pThis;}
template<int n, typename Param>
static auto GetLuaValue( lua_State* luaState )->decltype(CheckLuaValue<Param>(n,luaState))
{
return CheckLuaValue<Param>(n,luaState);
}
template< typename sequence >
struct call;
template< int... I >
struct call<seq<I...>>
{
ReturnType operator()( lua_State* luaState, InstanceType* instance, MethodPtr method ) const
{
return (instance->*method)( GetLuaValue<I,Params>( luaState )... );
}
};
static int CFunctionWrapper( lua_State* luaState)
{
MethodPtr func = GetFunctionPointer();
InstanceType* instance = GetMemberPointer();
ReturnType retval = call< typename gen_seq< 1, sizeof...(Params)+1 >::type >()( luaState, instance, func );
return 0;
}
};
struct test{ int foo(int x, double d){std::cout << "x:" << x << " d:" << d << "\n";}};
int main(){
typedef MemberFunctionWrapper< int(test::*)(int, double) > wrapper;
test bar;
wrapper::GetFunctionPointer() = &test::foo;
wrapper::GetMemberPointer() = &bar;
wrapper::CFunctionWrapper(0);
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgIHN0cnVjdCBsdWFfU3RhdGUge307CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgVCBDaGVja0x1YVZhbHVlKCBpbnQgbiwgbHVhX1N0YXRlKiBsKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiYXJnWyIgPDwgbiA8PCAiXSBnb3R0ZW5cbiI7CiAgICAgICAgcmV0dXJuIFQobik7CiAgICB9CiAgICAKICAgIHRlbXBsYXRlPGludCAuLi4+CiAgICBzdHJ1Y3Qgc2VxIHsgfTsKICAgIAogICAgdGVtcGxhdGU8aW50IEZpcnN0LCBpbnQgTGFzdD4KICAgIHN0cnVjdCBnZW5fc2VxCiAgICB7CiAgICAgIHRlbXBsYXRlPGludCBOLCBpbnQuLi4gUz4KICAgICAgc3RydWN0IGhlbHBlciA6IGhlbHBlcjxOLTEsIE4tMSwgUy4uLj4ge307CiAgICAgIHRlbXBsYXRlPGludC4uLiBTPgogICAgICBzdHJ1Y3QgaGVscGVyPEZpcnN0LCBTLi4uPiB7CiAgICAgICAgdHlwZWRlZiBzZXE8Uy4uLj4gdHlwZTsKICAgICAgfTsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBoZWxwZXI8TGFzdD46OnR5cGUgdHlwZTsKICAgIH07CiAgICAKICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBYID4KICAgIHN0cnVjdCBNZW1iZXJGdW5jdGlvbldyYXBwZXI7CiAgICAKICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBGID4KICAgIHN0cnVjdCBNZW1iZXJGdW5jdGlvbkhlbHBlcgogICAgewogICAgICAgIHR5cGVkZWYgRiBNZXRob2RQdHI7CiAgICB9OwogICAgdGVtcGxhdGU8Y2xhc3MgSW5zdGFuY2VUeXBlLCB0eXBlbmFtZSBSZXR1cm5UeXBlLCB0eXBlbmFtZS4uLiBQYXJhbXM+CiAgICBzdHJ1Y3QgTWVtYmVyRnVuY3Rpb25XcmFwcGVyPCBSZXR1cm5UeXBlKEluc3RhbmNlVHlwZTo6KikoUGFyYW1zLi4uKSA+CiAgICB7CiAgICAgIHR5cGVkZWYgTWVtYmVyRnVuY3Rpb25IZWxwZXI8UmV0dXJuVHlwZShJbnN0YW5jZVR5cGU6OiopKFBhcmFtcy4uLik+IEhlbHBlcjsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBIZWxwZXI6Ok1ldGhvZFB0ciBNZXRob2RQdHI7CiAgICAgIHN0YXRpYyBNZXRob2RQdHImIEdldEZ1bmN0aW9uUG9pbnRlcigpIHtzdGF0aWMgTWV0aG9kUHRyIHBGdW5jOyByZXR1cm4gcEZ1bmM7fQogICAgICBzdGF0aWMgSW5zdGFuY2VUeXBlKiYgR2V0TWVtYmVyUG9pbnRlcigpIHtzdGF0aWMgSW5zdGFuY2VUeXBlKiBwVGhpcztyZXR1cm4gcFRoaXM7fQogICAgICB0ZW1wbGF0ZTxpbnQgbiwgdHlwZW5hbWUgUGFyYW0+CiAgICAgIHN0YXRpYyBhdXRvIEdldEx1YVZhbHVlKCBsdWFfU3RhdGUqIGx1YVN0YXRlICktPmRlY2x0eXBlKENoZWNrTHVhVmFsdWU8UGFyYW0+KG4sbHVhU3RhdGUpKQogICAgICB7CiAgICAgICAgcmV0dXJuIENoZWNrTHVhVmFsdWU8UGFyYW0+KG4sbHVhU3RhdGUpOwogICAgICB9CiAgICAgIAogICAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgc2VxdWVuY2UgPgogICAgICBzdHJ1Y3QgY2FsbDsKICAgIAogICAgICB0ZW1wbGF0ZTwgaW50Li4uIEkgPgogICAgICBzdHJ1Y3QgY2FsbDxzZXE8SS4uLj4+CiAgICAgIHsKICAgICAgICBSZXR1cm5UeXBlIG9wZXJhdG9yKCkoIGx1YV9TdGF0ZSogbHVhU3RhdGUsIEluc3RhbmNlVHlwZSogaW5zdGFuY2UsIE1ldGhvZFB0ciBtZXRob2QgKSBjb25zdAogICAgICAgIHsKICAgICAgICAgIHJldHVybiAoaW5zdGFuY2UtPiptZXRob2QpKCBHZXRMdWFWYWx1ZTxJLFBhcmFtcz4oIGx1YVN0YXRlICkuLi4gKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHN0YXRpYyBpbnQgQ0Z1bmN0aW9uV3JhcHBlciggbHVhX1N0YXRlKiBsdWFTdGF0ZSkKICAgICAgewogICAgICAgIE1ldGhvZFB0ciBmdW5jID0gR2V0RnVuY3Rpb25Qb2ludGVyKCk7CiAgICAgICAgSW5zdGFuY2VUeXBlKiBpbnN0YW5jZSA9IEdldE1lbWJlclBvaW50ZXIoKTsKICAgICAgICBSZXR1cm5UeXBlIHJldHZhbCA9IGNhbGw8IHR5cGVuYW1lIGdlbl9zZXE8IDEsIHNpemVvZi4uLihQYXJhbXMpKzEgPjo6dHlwZSA+KCkoIGx1YVN0YXRlLCBpbnN0YW5jZSwgZnVuYyApOwogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICB9OwogICAgCiAgICBzdHJ1Y3QgdGVzdHsgaW50IGZvbyhpbnQgeCwgZG91YmxlIGQpe3N0ZDo6Y291dCA8PCAieDoiIDw8IHggPDwgIiBkOiIgPDwgZCA8PCAiXG4iO319OwogICAgaW50IG1haW4oKXsKICAgICAgICB0eXBlZGVmIE1lbWJlckZ1bmN0aW9uV3JhcHBlcjwgaW50KHRlc3Q6OiopKGludCwgZG91YmxlKSA+IHdyYXBwZXI7CiAgICAgICAgdGVzdCBiYXI7CiAgICAgICAgd3JhcHBlcjo6R2V0RnVuY3Rpb25Qb2ludGVyKCkgPSAmdGVzdDo6Zm9vOwogICAgICAgIHdyYXBwZXI6OkdldE1lbWJlclBvaW50ZXIoKSA9ICZiYXI7CiAgICAgICAgd3JhcHBlcjo6Q0Z1bmN0aW9uV3JhcHBlcigwKTsKICAgIH0=