转换困难:Void* 和指向成员函数的指针
在编程领域,不同数据类型之间的转换通常会带来挑战,尤其是当处理指向成员函数的指针时。本文深入探讨了在尝试创建与 Lua 解释器交互的 C 库时遇到的问题,其中将 void* 转换为指向成员函数的指针构成了重大障碍。
有问题的代码尝试注册一个C 对象作为 LuaObject 并向该对象添加成员函数:
template <class T> LuaObject<T> lobj = registerObject(L, "foo", fooObject); lobj.addField(L, "bar", &Foo::bar);
但是,以下函数导致了问题:
template <class T> int call_int_function(lua_State *L) { // problematic line void (T::*method)(int, int) = reinterpret_cast<void (T::*)(int, int)>(lua_touserdata(L, lua_upvalueindex(1))); T *obj = reinterpret_cast<T *>(lua_touserdata(L, 1)); (obj->*method)(lua_tointeger(L, 2), lua_tointeger(L, 3)); return 0; }
问题在于编译器的抱怨:无法将 void 转换为指向成员函数的指针。指向成员的指针是特定的,不能直接转换为常规指针,如 void.
要解决此问题,解决方案是将成员函数包装在常规函数中,而不是使用指向成员的指针。此方法涉及创建一个自由函数,该函数接受对象作为其第一个参数并在内部调用成员函数。
这是使用此方法的函数的修改版本:
template <class T> int call_int_function(lua_State *L) { void (*method)(T*, int, int) = reinterpret_cast<void (*)(T*, int, int)>(lua_touserdata(L, lua_upvalueindex(1))); T *obj = reinterpret_cast<T *>(lua_touserdata(L, 1)); method(obj, lua_tointeger(L, 2), lua_tointeger(L, 3)); return 0; }
通过包装成员函数,我们避免了将 void* 转换为指向成员函数的指针,解决了在这两种数据类型之间进行转换时遇到的问题。
以上是如何安全地将 void* 转换为 C 中成员函数的指针?的详细内容。更多信息请关注PHP中文网其他相关文章!