В библиотеке C ++, которую я не могу изменять, у меня есть конструктор, который выглядит следующим образом:
Dfa(const int n_state, const int dim_alf, const string *alf);
Если я просто свяжусь с
.def(py::init<const int, const int, const std::string*>())
успешно компилируется.
Проблема в том, что я не могу передать строку * через python, потому что, например, если я пытаюсь выполнить на python
alph=['x','y']
z=Dfa(3,2,alph)
Возвращает следующую ошибку:
TypeError: __init__(): incompatible constructor arguments. The
following argument types are supported:
gi_gipy.Dfa(arg0: int, arg1: int, arg2: unicode)
Пользователь "R zu" любезно предложил мне написать обертку, но я не могу понять, как. Учитывая то, что в Python это что-то вроде: ['x','y']
,
в с ++ принимается как std::list<std::string>
Я попытался написать следующий код:
.def(py::init([](int n_state,int dim_alf, std::list<std::string> alph){
std::string* alfabeto=new std::string[dim_alf];
std::list<string>::iterator it=alph.begin();
for(int i=0;it!=alph.end();++i,++it) alfabeto[i]=*it;
Dfa::Dfa(n_state,dim_alf,alfabeto);
}))
но он возвращает мне 2 ошибки:
cannot pass expression of type 'void' to variadic function
construct<Class>(v_h, func(std::forward<Args>(args)...)
и
static_assert failed "pybind11::init(): init function must return a compatible pointer,
holder, or value"
static_assert(!std::is_same<Class, Class>::value /* always false */
Ясно, что я немного запутался в том, как преодолеть эту проблему, и думаю, что это связано с использованием указателя на строку в качестве параметра для конструктора. Повторяю, я не могу изменить библиотеку, я могу только создать соответствующую привязку. Спасибо за внимание