我有以下代码:
我正在将lua嵌入到一个项目中,目前正在寻找一种从lua中调用方法的方法,并从调度程序自动从lua堆栈中提取参数。通过这些“简单”的模板,可以轻松生成所需的调用,以从给定参数中提取数据,而不会出现任何打字错误。
但是,我的问题是,当解包
因此,如何确保
编辑:我忘记了调用需要按反转顺序进行,我认为任何语言机制都无法实现这一点。 因此,这是我的解决方案,回到常规的非可变模板:
lib.hxx:
template <typename C, typename R, typename ... Args>
R Lib::extract_call(lua_State* L, R(C::*method)(Args...))
{
return static_cast<C*>(this)->*method(extract_data<Args>(L)...);
}
lib.cc:
template <>
std::string Lib::extract_data(lua_State* L)
{
if (! lua_isstring(L, -1))
{
return "";
}
return lua_tostring(L, -1);
}
[...] // Other specializations following
我正在将lua嵌入到一个项目中,目前正在寻找一种从lua中调用方法的方法,并从调度程序自动从lua堆栈中提取参数。通过这些“简单”的模板,可以轻松生成所需的调用,以从给定参数中提取数据,而不会出现任何打字错误。
但是,我的问题是,当解包
extract_data<Args>(L)...
时,所有extract_data
调用的评估顺序未指定(如标准所述,为了优化目的),而从lua堆栈中提取数据的顺序确实很重要。
另一方面,我无法将所有这些调用分组在初始化器列表中,因为它们具有不同的类型。因此,如何确保
extract_data
调用按特定顺序进行,或者至少保持自动传递参数到我的成员指针函数的方式?编辑:我忘记了调用需要按反转顺序进行,我认为任何语言机制都无法实现这一点。 因此,这是我的解决方案,回到常规的非可变模板:
template <typename C, typename R, typename A1>
R Lib::extract_call(lua_State* L, R(C::*method)(A1))
{
return (static_cast<C*>(this)->*method)(extract_data<A1>(L));
}
template <typename C, typename R, typename A1, typename A2>
R Lib::extract_call(lua_State* L, R(C::*method)(A1, A2))
{
A2 b = extract_data<A2>(L);
A1 a = extract_data<A1>(L);
return (static_cast<C*>(this))->*method(a,b);
}
template <typename C, typename R,
typename A1, typename A2, typename A3>
R Lib::extract_call(lua_State* L, R(C::*method)(A1, A2, A3))
{
A3 c = extract_data<A3>(L);
A2 b = extract_data<A2>(L);
A1 a = extract_data<A1>(L);
return (static_cast<C*>(this))->*method(a,b,c);
}
// And so on up to 8 arguments
std::tuple
来完成这个任务:http://coliru.stacked-crooked.com/a/7935d16232f21a5c。最终的解包(unpacking)可以使用 index-sequence 来完成。 - Xeo