有些函数需要向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、参数从左到右,所以栈顶元素是函数签名最右边的参数。