Я пытаюсь обернуть C++ API, и я натыкаюсь на контрольно-пропускной пункт для некоторых членов класса char*
. Похоже, что boost-python автоматически преобразует типы char const *
и std::string
в объекты python (на основе этот ответ), но он отказывается от char*
типов. Это ошибка, которую я получаю (в python):
TypeError: No to_python (by-value) converter found for C++ type: char*
Оказывается, эти конкретные члены char *
, вероятно, должны были быть объявлены как char const *
, поскольку строки никогда не изменяются.
Я новичок в boost-python, поэтому, возможно, есть очевидный ответ, но мне не очень повезло с гуглом.
Есть ли простой способ заставить boost-python автоматически конвертировать эти char*
членов? (К сожалению, я не могу изменить объявления char *
на char const *
, так как API, который я оборачиваю, не находится под моим контролем.)
ОБНОВЛЕНИЕ:
Итак, я думаю, что мне нужно добавить собственный преобразователь для обработки char*
элементов. Я начал писать один:
/** to-python convert for char* */
struct c_char_p_to_python_str
{
static PyObject* convert(char* s) {
return incref(object(const_cast<const char*>(s)).ptr());
}
};
// register the QString-to-python converter
to_python_converter<char*, c_char_p_to_python_str>();
К сожалению, это не работает. Это ошибка:
error: expected unqualified-id
to_python_converter<char*, c_char_p_to_python_str>();
^
Изучив документы, я могу посмотрите, что аргументы шаблона имеют эту подпись:
template <class T, class Conversion, bool convertion_has_get_pytype_member=false>
Поскольку char*
не является классом, я предполагаю, что это не сработало. У кого-нибудь есть понимание?
ОБНОВЛЕНИЕ 2:
Неа. Оказывается, to_python_converter
нужно вызвать внутри вызова BOOST_PYTHON_MODULE
.
У меня работает to_python_converter
(с некоторыми изменениями). Я также написал функцию для преобразования формы python и зарегистрировал ее с помощью converter::registry::push_back
. Я вижу, как работает мой код to_python, но код from_python никогда не запускается.
const
требуется. Кроме того, если вы еще не используете boost в другом месте, вам может быть интересно узнать, что существует более легкий, более свежий (c++ 11 и новее) проект, который реализует те же функции (это почти форк): pybind11, где эта проблема может отсутствовать или быть решенной. - person Silmathoron   schedule 27.03.2016char*
участники? Владеет ли ими класс (отвечает ли он за выделение/освобождение памяти? Поведение геттера простое, но что именно, по вашему мнению, делает сеттер? Перезаписывать существующую строку/буфер, насколько это возможно? Перераспределять память, если необходимо? Вы упомянули, что строки никогда не изменяются - можно ли просто сделать это свойство доступным только для чтения? - person Dan Mašek   schedule 28.03.2016char *s = "foo"; s[0] = 'F';
никогда не бывает), но переназначаемый. Назначение из python должно выделять новый char * и устанавливать для него переменную-член. - person Stephen   schedule 28.03.2016