C++ PyBind11:绑定使用双指针的函数

C++ PyBind11:绑定使用双指针的函数,c++,c++11,pybind11,C++,C++11,Pybind11,我想用PyBind11绑定一个C++函数。问题是,此函数有一个带双指针的参数,编译器会引发错误 错误:无法使用类型为“typename make\u caster::cast\u op\u type”(又名“char*”)的右值初始化类型为“char**”的参数。 具体而言,代码如下所示: #include <pybind11/pybind11.h> #include <iostream> namespace py = pybind11; void parse_ar

我想用PyBind11绑定一个C++函数。问题是,此函数有一个带双指针的参数,编译器会引发错误

错误:无法使用类型为“typename make\u caster::cast\u op\u type”(又名“char*”)的右值初始化类型为“char**”的参数。

具体而言,代码如下所示:

#include <pybind11/pybind11.h>

#include <iostream>

namespace py = pybind11;

void parse_args(int argn__, char** argv__)
{
  for(int i = 1; i < argn__; ++i)
    {
      std::cout<< argv__[i];
    }
}

PYBIND11_MODULE(argv_bind, m) {
   m.def("parse_args", &parse_args);     
}
#包括
#包括
名称空间py=pybind11;
void parse_args(int argn_,char**argv_)
{
对于(int i=1;istd::cout对于非简单参数类型(如
char**
),您必须包装函数本身,包装器提供从简单类型或Python对象到所需类型的逻辑

在这种情况下,
char*
实际上是一种非常不安全的类型,因为它不能进行内存清理;要使这项工作可靠,您需要使用
std::string
s,然后您可以通过
c_str()
方法从中访问
char*
。(在pybind11中,即使使用
char*
参数,这些实际上只是指向
std::string
参数的指针:Python API故意不让调用者访问Python字符串的内部存储)

因此,您只需要将它与一个类型结合起来,该类型本身可以将整个内容公开为
char**
,这正是
std::vector
的设计目的

#include <pybind11/stl.h>

m.def("parse_args", [](std::vector<std::string> args) {
    std::vector<char *> cstrs;
    cstrs.reserve(args.size());
    for (auto &s : args) cstrs.push_back(const_cast<char *>(s.c_str()));
    return parse_args(cstrs.size(), cstrs.data());
});
#包括
m、 def(“parse_args”,[](std::vector args){
std::向量cstrs;
cstrs.reserve(args.size());
对于(auto&s:args)cstr.push_back(const_cast(s.c_str());
返回parse_args(cstrs.size(),cstrs.data());
});

(如果您的
parse_args
实际使用了
const char**
,您可以删除
const_cast
)PybDun11可能无法决定Python类等于双指针。Python代码如何提供双指针到C++扩展?Python端可以给一个NUMPY数组或Python列表,它被翻译成<代码> Py::Laby< /C>,EGEN数组,或者< Cuth:STD::Cist< <代码> C++旁边。顺便提一下,Pyth.ON的代码> sys > ARGV < /C>和 AgPARSE> < /COD>已经可以解析命令行参数。您可以使用这些代码,将其结果通过C++ >代码> BoOL ,<代码> STD::String ,<代码> int >代码>等等。因为解析命令行参数不是性能关键的,Python可以做到这一点。如果您能看一下,我将非常感激。还有我的问题,谢谢。