显然,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(普通)未绑定功能相同.那么,有没有人知道这方面的解决方法?
std::function相对较新 (C++11),因此 SWIG 没有任何开箱即用的解决方案。虽然不那么灵活,但您可以使用函数指针,但需要注意。引用文档中的5.4.9 函数和回调指针:
...SWIG 提供对函数指针的全面支持,前提是回调函数是用 C 而不是目标语言定义的。
所以传递 lambda 是行不通的。阅读文档链接以获取一些替代方案。