Pointers Lua如何在C++&&;将其传递回C++;
现在我想传递一个指向Lua的Pointers Lua如何在C++&&;将其传递回C++;,pointers,lua,luabind,Pointers,Lua,Luabind,现在我想传递一个指向Lua的void*指针,使用userdata? 如何做到这一点 顺便说一句,我使用了luabind,但它不能传递指向Lua堆栈的void*指针,这很烦人!你们能帮帮我吗 struct事件 { A*A; B*B; ... }; 事件*e; void*实例=(void*)e; //param是从Lua脚本传递的参数。param是一个事件对象。我把它扔进了一个空白的类型 字符串应答(void*param) { WorkEvent*pWorkEvent=静态强制转换(参数); ASS
void*
指针,使用userdata?
如何做到这一点
顺便说一句,我使用了luabind,但它不能传递指向Lua堆栈的void*
指针,这很烦人!你们能帮帮我吗
struct事件
{
A*A;
B*B;
...
};
事件*e;
void*实例=(void*)e;
//param是从Lua脚本传递的参数。param是一个事件对象。我把它扔进了一个空白的类型
字符串应答(void*param)
{
WorkEvent*pWorkEvent=静态强制转换(参数);
ASSERT_RET(pWorkEvent,NULL);
字符串调用_id=pWorkEvent->GetCallId();
CCmThreadManager::t类型thrd_id=pWorkEvent->GetHandleThrdID();
协同程序*pco=pWorkEvent->m_pco;
在讨论为什么不应该这样做之前,让我们先回答您的实际问题
LuaBind是一种将C++函数和对象绑定到Lua的工具。一个代码>空白> */COD>既不是函数也不是对象。它是一个指针,它对Lababink没有实际意义。因此,不能直接传递一个。 但是,您可以返回一个
luabind::object
,它可以表示任何Lua值。例如,一个Lua userdata。这意味着您可以从void*
创建一些轻用户数据,将其粘贴到luabind::object
中,并从您注册到luabind的函数返回它
luabind::object RegisteredFunction(..., lua_State *L)
{
void *return_value = ...;
lua_pushlightuserdata(L, return_value);
luabind::object ret(luabind::from_stack(L, -1));
lua_pop(L, 1);
return ret;
}
要允许Lua将其传回以便您可以检索它,只需创建一个函数,将luabind::object作为void*
参数:
void OtherRegisteredFunction(..., luabind::object obj, ...)
{
assert(luabind::type(obj) == LUA_TLIGHTUSERDATA);
obj.push();
void *param = lua_touserdata(obj.interpreter(), -1);
lua_pop(obj.interpreter(), 1);
}
这就是你传递这种数据的方式。这就是为什么你不应该这样做
首先,您的代码被破坏:
WorkEvent*pWorkEvent=静态_转换(参数);
假设你的代码> PARAM <代码>来自这行,事件*
开始,然后将其转换为无效*
。唯一合法的操作是将其转换回事件*
。即使工作事件
是事件
的派生类,也不能将其直接转换为该类。您必须首先将其转换回事件*
。此外,您应该使用dynamic_cast
在发生事件*
后进行向下转换
第二,停止使用void*
s进行此操作。如果您的所有事件都是从Event*
派生的,那么只需传递一个Event*
并在适当的地方使用dynamic\u cast
。如果不是,那么您应该这样做(LuaBind需要Boost,显然您已经在使用它).您不仅可以将其绑定到LuaBind(因为它是实际类型),而且使用它更自然
而且它具有内置的保护功能,可以完全避免您的代码以前遇到的问题;如果您试图将它强制转换为
工作事件,而只给它一个事件,它将抛出一个异常。我们不会直接在lua中使用void*。
这里我们使用c函数调用lua函数,然后使用lua函数调用c函数
在第一个c中,我们将一个void*传递给lua函数
然后lua将void*传递给第二个c函数
但是我们发现我们不能把一个空传给lua
当我们添加默认的_转换器void*时
namespace luabind
{
template <>
struct default_converter<void*> : native_converter_base<void*>
{
static int compute_score(lua_State * L, int index)
{
// this function will return 0 or -1 (int)
return lua_type(L, index) == LUA_TLIGHTUSERDATA ? 0 : -1;
}
void* from(lua_State * L, int index)
{
return lua_touserdata(L, index);
}
void to(lua_State * L, void* value)
{
lua_pushlightuserdata(L, value);
}
};
} // namespace luabind
名称空间luabind
{
模板
结构默认\u转换器:本机\u转换器\u基
{
静态整数计算分数(lua\U状态*L,整数索引)
{
//此函数将返回0或-1(int)
返回lua_type(L,index)=lua_TLIGHTUSERDATA?0:-1;
}
void*from(lua_State*L,int索引)
{
返回lua_tuserdata(L,索引);
}
作废至(lua_状态*L,作废*值)
{
lua_pushlightuserdata(L,值);
}
};
}//名称空间luabind
您尝试了什么?请显示您的代码。在哪个系统上使用哪个版本的lua
字符串回答(void*param){WorkEvent*pWorkEvent=static\u cast(param);ASSERT\u RET(pWorkEvent,NULL);字符串调用\u id=pWorkEvent->GetCallId();CCmThreadManager::TType thrd\u id=pWorkEvent->GetHandleThrdID()请把你的问题编辑起来,把你的代码放在问题中,而不是评论中。我已经发布了相关代码。你试过阅读了吗?那么,为什么你想在使用LuabDink时通过一个空洞?LuabDin是这样的,这样你就可以安全地操纵Lua的C++对象。好,我明白了。我必须找到另一个。解决我问题的方法。谢谢你。
namespace luabind
{
template <>
struct default_converter<void*> : native_converter_base<void*>
{
static int compute_score(lua_State * L, int index)
{
// this function will return 0 or -1 (int)
return lua_type(L, index) == LUA_TLIGHTUSERDATA ? 0 : -1;
}
void* from(lua_State * L, int index)
{
return lua_touserdata(L, index);
}
void to(lua_State * L, void* value)
{
lua_pushlightuserdata(L, value);
}
};
} // namespace luabind