2

この状況では、可変量のパラメーターを関数に渡す方法が必要です。

template<typename ...T>
struct Lunch
{
    Lunch(T...){}
};

template<typename T>
T CheckLuaValue(lua_State* luaState,int index)
{
    //Do Stuff
    return value;
}

template <class MemberType, typename ReturnType, typename... Params>
struct MemberFunctionWrapper <ReturnType (MemberType::*) (Params...)>
{
    static int CFunctionWrapper (lua_State* luaState)
    {
        ReturnType (MemberType::*)(Params...) functionPointer = GetFunctionPointer();
        MemberType* member = GetMemberPointer();

        int index = 1;

        //Get a value for each type in Params
        Lunch<Params...>
        {
           (CheckLuaValue<Params>(luaState,index), index++, void(), 0)...
        };

CheckLuaValue は、Params の各型の値を返します。私の問題は、これらすべての値で関数を呼び出す方法が必要になったことです

        member->*functionPointer(returnedLuaValues); 

    }
};

どうすればこれを行うことができますか?

4

2 に答える 2

2

そこで、sFuller と Pubby に対する Luc Danton のシーケンスに関するアドバイス (シーケンスについて) の一部を盗み、次の「いじり回しをやめてくださいoperator,」バージョンを生成しました。

#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 { };

// generates a seq< First, ..., Last-1 > as "type"
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);
}

ここで、CheckLuaValue の呼び出しが順不同である可能性があることに注意してください (つまり、引数 1 の前に Lua から引数 2 を要求できます) が、正しいものは正しい引数に渡されます。

テストランはこちら: http://ideone.com/XVmQQ6

于 2012-11-19T06:09:26.767 に答える
1

私の理解が正しければLunch、メンバー関数ポインターを呼び出すように定義を変更する必要があります。

template <class MemberType, typename ReturnType, typename... Params>
struct MemberFunctionWrapper <ReturnType (MemberType::*) (Params...)>
{
  template<typename ...T>
  struct foo // new Lunch
   {
     foo(ReturnType (MemberType::*)(Params...) functionPointer, MemberType* member, T... args){
       member->*functionPointer(args...);
     }
   };

   static int CFunctionWrapper (lua_State* luaState)
    {
        ReturnType (MemberType::*)(Params...) functionPointer = GetFunctionPointer();
        MemberType* member = GetMemberPointer();

        int index = 1;
        //member->*(bindedMemberFunction->memberFunction);

        //Get a value for each type in Params
        foo<Params...>
        {
           functionPointer,
           member,
           (++index, CheckLuaValue<Params>(luaState,index))...
        };
    }
};
于 2012-11-19T03:07:16.383 に答える