2012-03-25 9 views
1

私はこのコードのスニペットを持っている:は、テンプレート関数の再帰呼び出しを最適化するのに十分なほどスマートです。

template<typename... Args> class function_helper<void(Args...)>{ 
public: 
    typedef void(*generic_function)(Args...); 
    static void call(lua_State* l, generic_function func, Args... args){ 
     func(args...); 
    } 
    template<typename... retrieved> static void call(lua_State* l, generic_function func, retrieved... read){ 
     call(l, func, read..., to<typename std::tuple_element<sizeof...(read), std::tuple<Args...> >::type >(l, 1+sizeof...(read))); 
    } 
    static int wrapper(lua_State* l){ 
     assert(lua_isuserdata(l, lua_upvalueindex(1))); 
     call(l, generic_function(lua_touserdata(l, lua_upvalueindex(1)))); 
     return 0; 
    } 
}; 

目的は、それがfunction_helper::wrapperを押して、LUAから呼び出すだように、(任意の長さの引数リストを持つ)free関数ラッパーを持つことです。 すべて正常に機能します。私の「心配」のG ++はcallの再帰呼び出しのような

call(luastate, to<type1>(luastate, 1), to<type2>(luastate, 2), to<type3>(luastate, 3), ...); 

の単一の呼び出しに置き換えることができることを理解できるほど賢くないということである私のコンパイラがg ++ 4.6.1です。 g ++ 4.7以降の情報があれば、それも歓迎です。

P.S. std::tupleの使用は、g ++ 4.6の制限の回避策です。varargの引数リストに直接varargテンプレートリストを展開することはできません。

答えて

0

#gcc @ freenodeで尋ねました。彼らは関数のローカル変数のポインタを取らない限り、はいと答えました。しかし、何もないので答えはイエスです。

関連する問題