我有以下代码:
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 堆栈中提取参数。从这些“简单”模板中,可以轻松生成从参数中给出的 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