2012-03-25 44 views
1

我有這樣的代碼片段:是g ++的智能足以優化模板函數的遞歸調用?

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

的目的是爲了有一個免費的函數包裝(任意長度的參數列表),所以它的調用由LUA推function_helper::wrapper。 一切正常。我的「憂」的是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限制的一種解決方法,它不能直接將可變參數模板列表解壓縮爲可變參數或其他東西。

回答

0

我在#gcc @ freenode詢問。他們說是的,除非你使用函數局部變量的指針。但既然沒有,答案應該是肯定的。