我想调用一个 C++ 函数,该函数使用 boost::python 获取指向 Python 列表中的数组的指针。我有这样的解决方案:
//A function that takes a pointer to an array
void doSomething( int const n, double * a)
{
for ( std::size_t i=0; i<n; ++i)
a[i] += 1.;
}
//My solution
std::vector<double> add1 (std::vector<double> vec)
{
doSomething(vec.size(),vec.data());
return vec;
}
//boost::python registration
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(vector2)
{
using namespace boost::python;
def("doSomething", doSomething);
def("add1", &add1);
class_<std::vector<double> >("VectorOfDouble")
.def(vector_indexing_suite<std::vector<double> >());
}
在 Python 中有效:
>>> import vector2
>>> lint=[1,2,3,4]
>>> old_vector = vector2.VectorOfDouble()
>>> old_vector.extend(arg for arg in lint)
>>> new_vector=vector2.add1(old_vector)
>>> print list(old_vector)
[1.0, 2.0, 3.0, 4.0]
>>> print list(new_vector)
[2.0, 3.0, 4.0, 5.0]
但是,这需要将原始列表复制到新列表中。由于我正在使用的数组非常大,我宁愿避免这种情况。像这样对我的解决方案进行修改不会返回任何错误,但不会修改原始对象:
//My solution
void add1 (std::vector<double> vec)
{
doSomething(vec.size(),vec.data());
}
在蟒蛇:
>>> import vector2
>>> lint=[1,2,3,4]
>>> old_vector = vector2.VectorOfDouble()
>>> old_vector.extend(arg for arg in lint)
>>> print list(old_vector)
[1.0, 2.0, 3.0, 4.0]
>>> vector2.add1(old_vector)
>>> print list(old_vector)
[1.0, 2.0, 3.0, 4.0]
有没有办法调用 doSomething 并修改原始向量而不创建新向量?
顺便说一句,根据另一篇文章的建议,我还尝试编写一个简单的包装器来获取指向向量第一个元素的指针:
std::string * pointer (std::string& p)
{
return &p;
}
但似乎任何返回指针的函数的Boost注册都会在编译时产生非常长的错误。