使用SWIG处理std :: function

Ste*_*ppo 5 c++ swig c++11

显然,SWIG不理解std::function和破坏Python绑定.例如,这适用于C++:

// Somewhere in the API
typedef std::function<void(const UnitError & error)> UnitErrorHandler;

// Somewhere else in the API
void Unit::setErrorHandler(const UnitErrorHandler & handler) {}

// In the application code
unit->setErrorHandler([](const UnitError & error){
    std::cerr << error << std::endl;
    std::exit(1);
});
Run Code Online (Sandbox Code Playgroud)

但这会破坏代码(除了为了简单起见而有不同的行为,但这不是重点):

unit.setErrorHandler(lambda error: len(error))
Run Code Online (Sandbox Code Playgroud)

情况与def(普通)未绑定功能相同.那么,有没有人知道这方面的解决方法?

Mar*_*nen 1

std::function相对较新 (C++11),因此 SWIG 没有任何开箱即用的解决方案。虽然不那么灵活,但您可以使用函数指针,但需要注意。引用文档中的5.4.9 函数和回调指针

...SWIG 提供对函数指针的全面支持,前提是回调函数是用 C 而不是目标语言定义的。

所以传递 lambda 是行不通的。阅读文档链接以获取一些替代方案。