在讨论为什么不应该这样做之前,让我们先回答您的实际问题。
LuaBind 是一个将 C++ 函数和对象绑定到 Lua 的工具。Avoid*既不是函数也不是对象。从字面上看,它是指向nothing的指针。因此,它对 LuaBind 没有真正的意义。所以你不能直接通过一个。
但是,您可以返回 a luabind::object,它可以表示任何 Lua 值。例如,一个 Lua 用户数据。这意味着您可以从您的 . 中创建一些轻量级用户数据void*,将其粘贴到 a 中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 = static_cast<WorkEvent*>(param);
假设您param来自这一行,void* instance = (void*)eC++ 不保证它可以工作。如果你将一个对象强制转换为 a void*,C++仅提供了一个保证,如果你将它强制转换为与以前完全相同的对象,则可以得到有用的东西。
您从 开始Event*,然后将其转换为void*。您可以做的唯一合法操作是将其转换回Event*. 即使WorkEvent是 的派生类Event,也不能直接将其强制转换为该类。你必须把它变成Event*第一个。此外,dynamic_cast一旦你有一个Event*.
其次,停止使用void*s 。如果您的所有事件都来自Event*,则只需传递 anEvent*并dynamic_cast在适当的地方使用。如果不是,那么您应该使用boost::any(LuaBind 需要 Boost,所以显然您已经在使用它了)。您不仅可以将它绑定到 LuaBind(因为它是一个实际类型),而且使用起来更加自然。
它具有内置的保护功能,可以避免您的代码之前遇到的问题;如果您尝试将其强制转换为 aWorkEvent时仅给出 a Event,它将引发异常。