Boost.Python:__ init__接受无参数

时间:2009-12-02 05:50:49

标签: python crash boost-python

我有一个用Boost.Python包装的C ++值类型,它有一个NULL值的概念。包装器代码的相关部分如下所示:

class_<TCurrency> currency( "TCurrency" )
    .def( init<long>() )
    .def( init<const std::string&>() )
    <...>;

目前,尝试通过将None传递给__init__()方法在Python中创建NULL实例会导致C ++ ctor接受使用无效引用调用const字符串引用。 (&arg == NULL

是否可以捕获将None传递给构造函数并正常处理它的情况,或者至少在程序崩溃之前抛出一个有意义的异常?

使用Boost 1.36和Python 2.6.2。

1 个答案:

答案 0 :(得分:2)

如果使用None,添加init<void*>重载将传递NULL,但我不确定这会如何影响角落情况下的其他ctors。我也没有得到相同的无字符串const&amp;如果我离开init<void*>,你提到的转换。使用Boost.Python 1.37和Python 2.6.2。

示例:

#include <iostream>
#include <string>

#include <boost/python.hpp>


struct A {
#define BODY { std::cout << __PRETTY_FUNCTION__ << '\n'; }
    A() BODY
    A(long) BODY
    A(std::string const&) BODY
    A(void* p) BODY
#undef BODY
};

BOOST_PYTHON_MODULE(ex) {
using namespace boost::python;
class_<A>("A")
    .def(init<long>())
    .def(init<std::string const&>())
    .def(init<void*>())
;
}
>>> import ex
>>> ex.A()
A::A()
<ex.A object at 0x839bf7c>
>>> ex.A(42)
A::A(long int)
<ex.A object at 0x839bfcc>
>>> ex.A("abc")
A::A(const std::string&)
<ex.A object at 0x839bf7c>
>>> ex.A(None)
A::A(void*)
<ex.A object at 0x839bfcc>

如果遗漏init<void*>

>>> ex.A(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
    A.__init__(A, NoneType)
did not match C++ signature:
    __init__(_object*, std::string)
    __init__(_object*, long)
    __init__(_object*)