我正在围绕 Lua 的 C Api 编写一个简单的包装器,并让函数采用 lua_State& 而不是指针。但是,当我尝试传递 lua_State* 值时,我必须取消引用它才能通过引用传递。扩展为的模板具有 func sig ,其中 vm 按值传递,而不是引用。
由于可以在没有完整定义的情况下使用对象的引用和指针,有没有一种方法可以仅使用类型的前向声明将指针值转换为被引用的值?
编辑:在玩了更多代码之后。取消引用适用于其中一个函数调用,但在另一个函数调用上失败。
namespace Vm {
template<typename VM, typename T>
void push( VM vm, T value );
// If this function isn't here, push will fail too.
template<typename T>
void push( lua_State& luaState, T value ) {
Vm::push( luaState, value );
}
template<>
void push( lua_State& luaState, double value ) {
lua_pushnumber( &luaState, value );
}
template<typename VM>
void pop( VM vm, Uint32 nIndices );
template<>
void pop( lua_State& luaState, Uint32 nIndices ) {
lua_pop( &luaState, nIndices );
}
}
int main( int argc, char** argv )
{
lua_State* luaState = luaL_newstate();
luaL_openlibs( luaState );
Vm::push( *luaState, (double)1.2f ); // This works fine.
Vm::pop( *luaState, 1 ); // This generates error.
}
编译器错误:
error: invalid use of incomplete type ‘struct lua_State’
error: forward declaration of ‘struct lua_State’
error: initializing argument 1 of ‘void Vm::pop(VM, Uint32) [with VM = lua_State; Uint32 = unsigned int]’