Boost Python用默认参数包装静态成员函数重载
我有附加的Python包装的C ++包装示例:成员函数(方法)是静态的,具有默认参数。 所以我使用BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS来定义重载函数。 没有编译错误,但是当我调用静态成员函数时出现如下错误:
import boostPythonTest
boostPythonTest.C.method("string")
--------------------------------------------------------------------------- ArgumentError Traceback (most recent call last)
<ipython-input-4-ab141804179c> in <module>()
----> 1 boostPythonTest.C.method("string")
ArgumentError: Python argument types in
C.method(str) did not match C++ signature:
method(class C {lvalue}, class std::basic_string<char,struct
std::char_traits<char>,class std::allocator<char> >)
method(class C {lvalue}, class std::basic_string<char,struct
std::char_traits<char>,class std::allocator<char> >, int)
method(class C {lvalue}, class std::basic_string<char,struct
std::char_traits<char>,class std::allocator<char> >, int, bool)
我不明白为什么第一个生成的签名是“class C {lvalue}”。 如果是这样,静态成员函数需要调用一个C的实例,它对我来说看起来是矛盾的。
另一方面,我在不使用成员函数重载的情况下定义了另一个静态成员函数,它适用于没有“class C {lvalue}”签名的情况。 例如:
boostPythonTest.C.noDefaultArgMethod("string", 0, True)
类型:函数字符串形式:Docstring:noDefaultArgMethod((str)arg1,(int)arg2,(bool)arg3) - > int:
C++ signature :
int noDefaultArgMethod(
class std :: basic_string,class std :: allocator>,int,bool)
任何人都可以帮助解释BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS的问题,或者给出一些建议如何将它作为真正的静态成员函数与重载?
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/args.hpp>
#include <boost/python/tuple.hpp>
#include <boost/python/class.hpp>
#include <boost/python/overloads.hpp>
#include <boost/python/return_internal_reference.hpp>
#include <boost/python/register_ptr_to_python.hpp>
#include <boost/python/object/class.hpp>
using namespace boost::python;
class C {
public:
static int method(const std::string &arg1, int arg2 = 0, bool arg3 = true) {
return 1;
};
static int noDefaultArgMethod(const std::string &arg1, int arg2 = 0, bool arg3 = true) {
return 10;
};
};
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(method1, C::method, 1, 3)
BOOST_PYTHON_MODULE(boostPythonTest)
{
class_<C>("C")
.def("method", (int(C::*)(const std::string&, int, bool))0, method1())
.staticmethod("method")
.def("noDefaultArgMethod", &C::noDefaultArgMethod)
.staticmethod("noDefaultArgMethod");
}
我相信这一行:
.def("method", (int(C::*)(const std::string&, int, bool))0, method1())
应该看起来像这样:
.def("method", &C::method, method1())
你应该使用BOOST_PYTHON_FUNCTION_OVERLOADS
而不是BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS
,因为没有涉及C
对象(静态函数指针只是函数指针,它们不是指向成员的指针)。
在这个wiki上还有一个例子,它重载了静态函数,其中相关部分是:
class X {
static int returnsum(int m, int x = 10) { return m + x; }
};
BOOST_PYTHON_FUNCTION_OVERLOADS(X_returnsum_overloads, X::returnsum, 1, 2)
BOOST_PYTHON_MODULE(foo)
{
class_<X>("X", ..)
.def("returnsum", &X::returnsum,
X_returnsum_overloads(args("x", "m"), "returnsum's docstring")
)
.staticmethod("returnsum")
;
}
这看起来正是你想要的。
链接地址: http://www.djcxy.com/p/83173.html上一篇: Boost Python wrap static member function overload with default argument