首页  >  文章  >  后端开发  >  如何在 void* 指针和 C 中成员函数指针之间进行转换?

如何在 void* 指针和 C 中成员函数指针之间进行转换?

Patricia Arquette
Patricia Arquette原创
2024-10-27 20:48:30194浏览

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

void* 和成员函数指针之间的转换

使用 C/C 互操作性时,尝试转换时可能会遇到困难位于 void 指针和指向成员函数的指针之间。在处理像 Lua 这样的语言中的闭包时,经常会出现这个问题,其中用户数据存储为 void 指针。

问题:

将 void* 转换为指向 a 的指针C 中的成员函数由于内存表示的根本差异而无效。指向成员的指针包含无法通过常规指针访问的附加信息。

解决方案:

要解决此问题,请考虑以下选项:

1。将成员函数包装在自由函数中:

  • 创建一个自由函数,该函数接受对象实例作为其第一个参数,并将成员函数参数作为后续参数。
  • 返回这个自由函数的地址,而不是指向成员的指针。

代码片段:

<code class="cpp">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;
}</code>

2.使用函数对象:

  • 利用类似于 Boost.Bind 的 mem_fun 的技术来创建一个包装成员函数的函数对象。
  • 模板化函数对象以支持不同的功能对象类型。

其他注意事项:

  • 确保对 lua_touserdata 返回的用户数据的控制,因为它不能包含有效的成员指针.
  • 如果需要额外的状态,请考虑将成员函数包装在类方法或静态函数中。

以上是如何在 void* 指针和 C 中成员函数指针之间进行转换?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn