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