【发布时间】:2012-08-22 10:00:18
【问题描述】:
我在将 C++ CLI 类的成员函数传递给库中的本机 C 回调时遇到问题。
确切地说是 Teamspeak 3 SDK。
您可以毫无问题地使用以下代码传递非成员函数:
struct ClientUIFunctions funcs;
/* Initialize all callbacks with NULL */
memset(&funcs, 0, sizeof(struct ClientUIFunctions));
funcs.onConnectStatusChangeEvent = onConnectStatusChangeEvent;
但我需要传递一个指向成员函数的指针,例如:
funcs.onConnectStatusChangeEvent = &MyClass::onConnectStatusChangeEvent;
欢迎任何其他想法如何在非静态成员函数中使用事件。
提前致谢!
【问题讨论】:
-
这只能通过静态类函数来完成,因为 C 对 vtable 或函数所属的对象一无所知...
-
以后有什么方法可以从静态类函数中调用成员函数吗?我需要访问事件中类的一些动态部分。
-
看看this other TS question。那里的人们使用一个由客户端 ID 索引的容器,并对其进行索引以获取一个对象实例以对其进行操作。或者,您可以使用单例对象和静态方法。鉴于teampeak API 没有为您提供不透明的“上下文”参数,我看不出有任何其他明智的方法可以解决这个问题。
-
您必须创建一个
static包装器,例如:static MyClass::wrapper(MyClass *thisone, Argtype args) { thisone->memfunc(args); },并找到一种方法使回调调用除了传递成员的正常参数之外还传递一个MyClass*ptr。另请注意,此时的参数应该是微不足道的(只有当它们是基元时,没有引用和非指针数据类型,即没有struct/class/union...)所以 C/C++ 肯定同意他们。 -
使用 Marshal::GetFunctionPointerForDelegate()。不需要静态方法。但请务必存储委托对象,以免被垃圾回收。
标签: c++ c function callback command-line-interface