Итак, я пытаюсь создать конвертер to_python, который позволит мне вернуть boost:: optional из открытой функции и обработать его как T, если опция установлена и None, если нет. Основываясь на сообщении, которое я нашел в С++ 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 генерирует следующее исключение: "ТипError: конвертер no to_python (по-значение), найденный для типа С++: std::string". Я знаю, что С++ способен преобразовывать строки в python, так как большинство моих открытых функций возвращают строки. Почему это не повышает:: 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>();
}
};
Теперь просто сделайте другую версию, чтобы она была более чистой и работала лучше.