我有这段代码:
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调用它。
一切顺利。我的“担心”是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 :(得分:0)
我在#gcc @ freenode问道。他们说是的,除非你采用函数局部变量的指针。但由于没有,答案应该是肯定的。