如何公开一个 returns 变体向量的函数?

How to expose a function which returns a variant vector?

我正在寻找一个 C++ 模块的小型工作示例,该模块具有 returns 一个 variant vector 并将其公开给 [=15] 的方法=](这似乎是一个古老的问题,可以追溯到 2004, but I could not find any clear answers onwards). I've read this and this and much more, but still I can not find a solution. As for documentation 它似乎立即将其 reader 大量信息抛出。我想要的是一个小的工作示例,其中包含一个小方法 returns 一个小向量。这就是我现在拥有的:

#include <boost/variant.hpp>
#include <boost/python.hpp>
#include <vector>

using namespace std;
using namespace boost:python

typedef boost::variant<int> variant;
typedef vector<variant> vector;

class Some{
   private:
      int idx;
   public:
      Some(...){ ... } //not important
      vector MyMethod(){
          return vector{1};
      }
 };

BOOST_PYTHON_MODULE(some){
    class_<vector>("vector").def(vector_indexing_suite<vector, true>());
    class_<Some>("Some",
        init ... //not important
        .def("MyMethod",&Some::MyMethod);
}

如果我注释掉这个方法,我对生成的共享库的编译、链接和使用没有任何问题。但是,如果有这样的方法返回一个向量,那么我会得到一大堆错误。我想,我需要做一些额外的步骤,比如打鼓和做一些其他的魔术(或一些数据类型转换等),但我不知道具体是什么步骤。

你应该为 variantto_python_converter,这样的事情应该有效:

#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
#include <Python.h>
#include <vector>
#include <boost/variant.hpp>

typedef boost::variant<int> number;
typedef std::vector<number> vector;

vector function()
{
   return vector{1};
}

struct number_to_object : boost::static_visitor<PyObject*>
{
   static result_type convert(number const& v)
   {
      return apply_visitor(number_to_object(), v);
   }

   template<typename T>
   result_type operator () (T const& v) const
   {
      return boost::python::incref(boost::python::object(v).ptr());
   }
};

void init_module() {}

BOOST_PYTHON_MODULE(pyexc_test)
{
   using namespace boost::python;

   class_<vector>("vector").def(vector_indexing_suite<vector, true>());

   to_python_converter<number, number_to_object>();
   implicitly_convertible<int, number>();

   def("function", function);
   def("init_module", init_module);
}