如何公开一个 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);
}
如果我注释掉这个方法,我对生成的共享库的编译、链接和使用没有任何问题。但是,如果有这样的方法返回一个向量,那么我会得到一大堆错误。我想,我需要做一些额外的步骤,比如打鼓和做一些其他的魔术(或一些数据类型转换等),但我不知道具体是什么步骤。
你应该为 variant
写 to_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);
}
我正在寻找一个 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);
}
如果我注释掉这个方法,我对生成的共享库的编译、链接和使用没有任何问题。但是,如果有这样的方法返回一个向量,那么我会得到一大堆错误。我想,我需要做一些额外的步骤,比如打鼓和做一些其他的魔术(或一些数据类型转换等),但我不知道具体是什么步骤。
你应该为 variant
写 to_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);
}