我有以下函数签名,我试图用Boost包装。蟒。
void myfunc(std::string str1, std::string str2,
std::function<void(std::string)> callback1,
std::function<void(int, std::string)> callback2);
我尝试在Boost.Python中将其导出为:
BOOST_PYTHON_MODULE(my_module)
{
using namespace boost::python;
class_<MyClass>("MyClass")
.def("myfunc", &MyClass::myfunc)
;
}
用Python调用它:
def update(message):
print(message)
def error(status, message):
print("Error {}: {}".format(status, message))
strarg1c= r"""path..."""
strarg2 = "test"
import my_module
obj = my_module.MyClass()
obj.myfunc(strarg1, strarg2, update, error)
但我收到以下错误:
Boost.Python.ArgumentError: Python argument types in
MyClass.myfunc(MyClass, str, str, function, function)
did not match C++ signature:
myfunc(class Myclass {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >, class std::function<void __cdecl(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)>, class std::function<void __cdecl(int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)>)
我发现了一些类似的问题,但它们通常将处理任意函数作为返回类型处理,而不是处理函数参数列表中的一个。我希望Boost.Python和std::function
有一些简单的东西。
似乎Pybind11 has this functionality。 Boost.Python中缺少此功能还是我遗漏了什么?