1

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

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

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

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

使用 Boost 1.36 和 Python 2.6.2。

4

1 回答 1

2

如果使用 None ,添加init<void*>重载将传递 NULL ,但我不确定这会如何影响极端情况下的其他 ctor。如果我遗漏了,我也没有得到您提到的相同的 None to string const& 转换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*>())
;
}
>>> 进口前
>>> ex.A()
A::A()
<ex.A 位于 0x839bf7c 的对象>
>>> ex.A(42)
A::A(长整数)
<ex.A 位于 0x839bfcc 的对象>
>>> ex.A("abc")
A::A(const std::string&)
<ex.A 位于 0x839bf7c 的对象>
>>> ex.A(无)
A::A(无效*)
<ex.A 位于 0x839bfcc 的对象>

如果init<void*>被排除在外:

>>> ex.A(无)
回溯(最近一次通话最后):
  <module> 中的文件“<stdin>”,第 1 行
Boost.Python.ArgumentError:Python 参数类型在
    A.__init__(A, NoneType)
与 C++ 签名不匹配:
    __init__(_object*, std::string)
    __init__(_object*, long)
    __init__(_object*)
于 2009-12-02T06:21:09.953 回答