Lua の C API の周りに単純なラッパーを作成し、ポインターの代わりに lua_State& を関数に取り込ませています。ただし、 lua_State* 値を渡そうとすると、参照渡しするために逆参照する必要があります。展開されたテンプレートには、参照ではなく値で渡される vm を持つ func sig があります。
完全な定義なしでオブジェクトの参照とポインターを使用することは可能であるため、型の前方宣言だけでポインター値から参照される値に変換する方法はありますか?
編集:コードをもう少しいじった後。逆参照は、関数呼び出しの 1 つで機能しますが、別の関数では失敗します。
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]’