在我不允许更改的 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']
,在 c++ 中被接受为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 */
很明显,我对如何克服这个问题有点困惑,我认为这与使用指向字符串的指针作为构造函数的参数有关。我再说一遍,我不能更改库,我只能创建适当的绑定。感谢您的关注