1 回答

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
成功!我有一個(gè)可行的解決方案:
我所做的想法是用“ director”包裝回調(diào),然后將Go函數(shù)指針返回“ Go”,以便可以在該上下文中運(yùn)行它。
下面的解決方案并不完美,但已經(jīng)足夠滿足我的需求,從現(xiàn)在開始很容易使其完美。
C ++文件:
class Callback {
public:
virtual void Run(void(*f)(void)) = 0;
virtual ~Callback() {}
};
Callback* GlobalCallback;
void TestFunc(void(*f)(void)) {
GlobalCallback->Run(f);
}
我添加了一個(gè)Callback類,它將在Go中“擴(kuò)展”(使用Swig導(dǎo)演),并且我將擁有該擴(kuò)展類的全局實(shí)例。因此,調(diào)用該實(shí)例的Run()將調(diào)用Go函數(shù),該函數(shù)將接收一個(gè)函數(shù)指針。
請注意,我的TestFunc現(xiàn)在不只是運(yùn)行f(),而是通過GlobalCallback運(yùn)行它。添加另一個(gè)函數(shù)將返回一個(gè)指向運(yùn)行GlobalCallback-> Run(f)的函數(shù)的指針,然后將此指針傳遞給該函數(shù)而不是* 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{}))
}
%}
請注意,我已經(jīng)添加了一個(gè)init()函數(shù),該函數(shù)通過運(yùn)行指針的Go函數(shù)來設(shè)置GlobalCallback。
就是這樣,Go代碼保持原樣,并且可以正常工作:)
- 1 回答
- 0 關(guān)注
- 300 瀏覽
添加回答
舉報(bào)