Я показываю свои классы C ++ через Boost.Python. Я намерен предоставить переменные-члены определенного пользователем типа класса с внутренней ссылкой. Это работало нормально, пока я не решил ввести переменную-член типа 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>()
или 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›, а не ссылку на такой объект. Я думал о замене конвертера, но я новичок в этом и действительно не знаю, как это сделать. Какие-либо предложения?