如何正确地将回调函数从swift传递给c ++?

时间:2016-08-25 15:13:39

标签: c++ swift pointers callback

我试图将一个回调函数从swift-code传递给c ++代码。我正在使用当前版本的Xcode。它适用于简单变量,但目前不适用于函数:

CPP-class.cpp:

bool * swiftvar;

void register_var(bool * varpntr){
    swiftvar = varpntr;
    cout<<"registered"<<endl;
}

void switch_var(){
    *swiftvar = !(*swiftvar);
    cout<<"switched"<<endl;
}

CPP-class.hpp:

#ifdef __cplusplus
extern "C"{
#endif

    void register_var(bool *);
    void switch_var();

#ifdef __cplusplus
}
#endif

并在swift中:

register_var(&testbool)
print(testbool)
switch_var()
print(testbool)

如果我尝试相同的功能(据我所知,在当前的swift版本中应该这么简单),我会收到错误。那么如何在swift中传递函数指针呢?我发现的所有方法都会导致错误。正如我所读到的,定义一个UnsafeMutablePointer对象的旧方法已经过时了,但它现在如何工作?我希望有类似的东西:

CPP-class.cpp:

void run_func(void * funcpntr()){
    (*funcpntr)();
}

CPP-class.hpp:

void run_func(void *);

(SWIFT伪代码):

run_func(testfunc())

或者是否有更好的解决方案从包装的cpp代码运行swift-functions?

任何帮助都会非常感激。提前致谢

2 个答案:

答案 0 :(得分:1)

首先,您需要在.cpp / .hpp中正确声明函数类型。

的.cpp:

void run_func(void (* funcpntr)()) {
    (*funcpntr)();
}

.HPP:

void run_func(void (* funcpntr)());

(您可以省略后者funcpntr,如Jarod42的答案所示。这需要包含在extern "C" {...}中,如第一个&#34; cpp-class.hpp所示:&#34)

和斯威夫特方面:

功能定义:

//This needs to be a toplevel function, which means it cannot be a method.
func test_func() {
    //...
}

将其传递给run_func()

    run_func(test_func)

或者您可以将句子传递给run_func

    //This closure cannot have captured variables.
    run_func {
        //...
    }

答案 1 :(得分:0)

签名将是

void run_func(void (*)()); // Declaration

// Definition
void run_func(void (*funcpntr)()) {
    (*funcpntr)();
}

使用

void testfunc(); 
run_func(&testfunc);