なぜこれを行うべきではないのかを説明する前に、実際の質問に答えましょう。
LuaBindは、C++関数とオブジェクトをLuaにバインドするためのツールです。Avoid*
は関数でもオブジェクトでもありません。それは、文字通り、何もないことへのポインタです。そのため、LuaBindにとって実際の意味はありません。したがって、直接渡すことはできません。
ただし、任意のLua値を表すことができるを返すことができます。luabind::object
たとえば、Luaのユーザーデータ。つまり、から簡単なユーザーデータを作成し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 = static_cast<WorkEvent*>(param);
param
あなたがこの行から来たと仮定するとvoid* instance = (void*)e
、C++はこれが機能することを保証しません。オブジェクトをにキャストした場合void*
、C ++は、以前とまったく同じオブジェクトにオブジェクトをキャストした場合にのみ、何か有用なものを取り戻すという保証を提供します。
から始めてEvent*
、それをに変換しましたvoid*
。あなたができる唯一の合法的なEvent*
操作は、それをにキャストバックすることです。WorkEvent
の派生クラスであっても、そのクラスに直接Event
キャストすることはできません。あなたはそれを最初に戻さなければなりません。また、を取得したら、を使用してダウンキャストを実行する必要があります。Event*
dynamic_cast
Event*
次に、void*
このためのsの使用を停止します。すべてのイベントがから派生している場合はEvent*
、を渡して、必要に応じEvent*
て使用dynamic_cast
します。そうでない場合は、使用boost::any
する必要があります(LuaBindにはBoostが必要なので、明らかにすでに使用しています)。これをLuaBindにバインドできるようになるだけでなく(実際のタイプであるため)、操作するのがはるかに自然になります。
また、コードが以前に抱えていた問題からの保護が組み込まれています。WorkEvent
が与えられたときにキャストしようとするとEvent
、例外がスローされます。