Итак, я пытаюсь создать конвертер to_python, который позволит мне возвращать boost :: опциональный из открытой функции и рассматривать его как T, если опциональный установлен, и None, если нет.Основываясь на сообщении, которое я нашел на C ++ Sig , я написал следующий код:
template<typename T>
struct optional_ : private boost::noncopyable {
struct conversion {
static PyObject* convert(boost::optional<T> const& value) {
if (value) {
return boost::python::to_python_value<T>()(*value);
}
Py_INCREF(Py_None);
return Py_None;
}
};
explicit optional_() {
boost::python::to_python_converter<boost::optional<T>, conversion>();
}
};
Насколько я могу судить, он работает для преобразования опций, но бросает Pythonследующее исключение «Ошибка типа: не найден конвертер to_python (по значению) для типа C ++: std :: string».Я знаю, что C ++ способен конвертировать строки в python, так как большинство моих открытых функций возвращают строки.Почему boost :: python :: to_python_value не распознает его, и как я могу использовать любой конвертер, который у него есть?
Исправлено путем изменения следующего (на основе этой статьи ):
template<typename T>
struct optional_ : private boost::noncopyable {
struct conversion {
static PyObject* convert(boost::optional<T> const& value) {
using namespace boost::python;
return incref((value ? object(*value) : object()).ptr());
}
};
explicit optional_() {
boost::python::to_python_converter<boost::optional<T>, conversion>();
}
};
Теперь просто сделайте другую версию, чтобы она была чище и работала лучше.