1 回答
TA贡献2065条经验 获得超14个赞
成功!我有一个可行的解决方案:
我所做的想法是用“ director”包装回调,然后将Go函数指针返回“ Go”,以便可以在该上下文中运行它。
下面的解决方案并不完美,但已经足够满足我的需求,从现在开始很容易使其完美。
C ++文件:
class Callback {
public:
virtual void Run(void(*f)(void)) = 0;
virtual ~Callback() {}
};
Callback* GlobalCallback;
void TestFunc(void(*f)(void)) {
GlobalCallback->Run(f);
}
我添加了一个Callback类,它将在Go中“扩展”(使用Swig导演),并且我将拥有该扩展类的全局实例。因此,调用该实例的Run()将调用Go函数,该函数将接收一个函数指针。
请注意,我的TestFunc现在不只是运行f(),而是通过GlobalCallback运行它。添加另一个函数将返回一个指向运行GlobalCallback-> Run(f)的函数的指针,然后将此指针传递给该函数而不是* f,这很容易解决。
我的Swig文件:
%{
#include "test.h"
%}
%module(directors="1") Callback
%feature("director");
%typemap(gotype) FUNC* "func()"
%typemap(in) FUNC* {
$1 = (void(*)(void))$input;
}
%apply FUNC* { void(*)(void) };
%include "test.h"
%insert(go_wrapper) %{
type go_callback struct { }
func (c* go_callback) Run(f func()) {
f()
}
func init() {
SetGlobalCallback(NewDirectorCallback(&go_callback{}))
}
%}
请注意,我已经添加了一个init()函数,该函数通过运行指针的Go函数来设置GlobalCallback。
就是这样,Go代码保持原样,并且可以正常工作:)
- 1 回答
- 0 关注
- 269 浏览
添加回答
举报