有些函數需要向lua返回多個結果,將這些結果存在table中是理所當然的。因為toLua++已經自動生成了函數的wrapper,所以沒辦法直接將棧頂table返回給Lua。好在toLua預留了lua_Object這個類型,可以代表lua中的任何類型,其實它只是int的typedef罷了,主要是在toLua解析程序時作為標記產生tolua_tovalue調用。在C/C++函數中,需要檢查一下棧頂是否為table類型,進行table元素的插入操作,例子函數如下:
void ActorMgr::GetPlayerEntityIDs( lua_Object lua_table )
{
TEntityListIt tIt ;
std::list <int> result;
for(int i = 0; i < ACOTOR_BUCKET_LEN ; ++i)
{
for(tIt =mSceneEntities[i].mEntities.begin(); tIt != mSceneEntities[i].mEntities.end( ); ++tIt )
{
TActorPtr tpActor = tIt->second->mpActor ;
if(tpActor ->GetActorType() == LOCAL_PLAYER)
{
result.push_front(tpActor->GetEntityID());
}
else if (tpActor-> GetActorType() == REMOTE_PLAYER )
{
result.push_back(tpActor->GetEntityID());
}
}
}
lua_State* L = LuaVM::GetInstPtr()->mLS ;
assert(lua_istable (L , -1));
std::list <int>:: iterator iter = result. begin();
for(int i = 1; iter != result .end(); ++ iter , ++i )
{
lua_pushinteger(L , *iter);
lua_rawseti(L , -2 , i);
}
lua_pop(L , 1);
}
需要注意的是,如果是多個參數,Lua的壓棧順序是object pointer、參數從左到右,所以棧頂元素是函數簽名最右邊的參數。