首页 > 后端开发 > C++ > 正文

如何安全地将 void* 转换为 C 中成员函数的指针?

Patricia Arquette
发布: 2024-10-28 06:07:30
原创
570 人浏览过

How to Safely Cast void* to a Pointer to Member Function in C  ?

转换困难:Void* 和指向成员函数的指针

在编程领域,不同数据类型之间的转换通常会带来挑战,尤其是当处理指向成员函数的指针时。本文深入探讨了在尝试创建与 Lua 解释器交互的 C 库时遇到的问题,其中将 void* 转换为指向成员函数的指针构成了重大障碍。

有问题的代码尝试注册一个C 对象作为 LuaObject 并向该对象添加成员函数:

template <class T>
LuaObject<T> lobj = registerObject(L, "foo", fooObject);
lobj.addField(L, "bar", &amp;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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!