我正在通过 Boost.Python 公开我的 C++ 类。我的目的是公开具有内部引用的用户定义类类型的成员变量。在我决定引入 boost::optional<T> 类型的成员变量之前,这一直很好。
有几篇很棒的文章展示了如何将 boost::optional<T> 公开为按值返回。具体来说,我已经实现了这个转换器。我的代码的其他相关部分如下所示:
struct Bar {}
struct Foo {
boost::optional<Bar> bar;
}
BOOST_PYTHON_MODULE(mymodule) {
using namespace boost::python;
python_optional<Bar>(); //registering the converter
class_<Foo>("Foo")
.add_property ( "bar", make_getter(&Foo::bar, return_value_policy<return_by_value>()), make_setter(&Foo::bar) )
;
}
我试图return_value_policy<return_by_value>()
用return_value_policy<reference_existing_object>()
or替换return_internal_reference<>()
。两者都产生了 Python TypeError:
>> import mymodule
>> foo = mymodule.Foo()
>> bar = foo.bar
TypeError: No Python class registered for C++ class boost::optional<Bar>
我的理解是,我现在得到了对 boost::optional<T> 对象的引用。但是,我注册的转换器没有被调用,因为它需要一个 boost::optional<T> 对象而不是对此类对象的引用。我想过更换转换器,但我是新手,我真的不知道怎么做。有什么建议么?