如何在 Boost Python 中访问 Vector

how to access vector in boost python

本文关键字:访问 Vector Python Boost      更新时间:2023-10-16

我想通过使用boost python访问python中的c ++向量。 向量在派生类函数中作为参数传递。但是我得到了错误。示例代码如下

class Base
{
  public:
  virtual void Set(const std::vector<std::string>& AllParameters) = 0;
 };
class derived: public Base
{
  void Set(const std::vector<std::string>& AllParameters)
  {
     // some code here
  };

 main.cpp
 struct Basewrapper : Base, wrapper<Base>
 {
   void Set(const std::vector<std::string>& AllParameters)
  {
    this->get_override("Set")(AllParameters); 
  };
 BOOST_PYTHON_MODULE(Example)
 {
    class_<Basewrapper , boost::noncopyable> ("Base")
    .def("Set",pure_virtual(&Base::Set))
    ;
  }

问题是当我从 Python 发送列表时,它给出的错误与 C++ 签名不匹配。感谢您的帮助

当我处理这种情况时,我通常的方法是,由于我无论如何都要为绑定编写一个包装器类,所以我可以创建使用 python 类型的"代理"函数。

boost 确实提供了轻松进行转换的功能,因此您只需使用代理函数中的函数即可。当然,要转换为实际std::vector您必须复制数据。如果列表可能非常大并且您不想这样做,则由您的C++类采用某种抽象迭代器。

在您的情况下,您可以创建一个名为 BaseProxy 的类,该类具有指向 Base 的指针/引用/共享 ptr,并具有一个名为 Set 的方法(或在您的 .def 中称为 Set),该方法获取 boost python 对象并将其转换为向量,然后对C++对象进行适当的调用。在这种情况下,它返回 void,但如果C++函数返回某些内容,则也会返回任何合适的内容。