我无法创建一个boost python前向迭代器来获取一个numpy数组作为C ++函数的输入,该函数将stl开头和结束迭代器作为模板并修改它,这里的代码是C ++函数:
template<typename _InputIt>
void vec_fill_increasing(_InputIt begin, _InputIt end, typename std::iterator_traits<_InputIt>::value_type start, typename std::iterator_traits<_InputIt>::value_type increment)
{
typedef typename std::iterator_traits<_InputIt>::value_type _Type;
if (std::is_floating_point<_Type>::value)
{
std::size_t count = 0;
while (begin != end)
{
*begin = start + ((_Type)count*increment);
++begin;
++count;
}
}
else {
while (begin != end)
{
*begin = start;
start += increment;
++begin;
}
}
在Boost Python中已经有一个stl输入迭代器的实现(即 stl_iterator.hpp )但是它不可变,所以这不会帮助我,所以我尝试根据输入迭代器创建自己的stl_forward_iterator。
namespace boost {
namespace python
{
// An STL forward iterator over a python sequence
template<typename ValueT>
struct stl_forward_iterator
: boost::iterator_facade<
stl_forward_iterator<ValueT>
, ValueT
, std::forward_iterator_tag
>
{
stl_forward_iterator()
: impl_()
{
}
// ob is the python sequence
stl_forward_iterator(boost::python::object const &ob)
: impl_(ob)
{
}
private:
friend class boost::iterator_core_access;
void increment()
{
this->impl_.increment();
}
ValueT& dereference() const
{
return extract<ValueT&>(this->impl_.current().get())();
}
bool equal(stl_forward_iterator<ValueT> const &that) const
{
return this->impl_.equal(that.impl_);
}
objects::stl_input_iterator_impl impl_;
};
}
}
我真正做的唯一改变是将deference函数的返回值更改为引用而不是仅仅是一个值。
我在我的主要应用程序中使用它如下:
template<typename T>
void wrap_fill_increasing(boost::python::numeric::array& array, T start, T increment) {
boost::python::stl_forward_iterator<T> begin(array);
boost::python::stl_forward_iterator<T> end;
vec_fill_increasing(begin, end, start, increment);
}
BOOST_PYTHON_MODULE(example) {
import_array();
p::numeric::array::set_module_and_type("numpy", "ndarray");
p::def("fill_increasing", &wrap_fill_increasing<int>);
}
int main(int argc, char **argv)
{
PyImport_AppendInittab("example", &PyInit_example);
Py_Initialize();
PyRun_SimpleString(
"import example\n"
"import numpy\n"
"z3 = numpy.zeros((1024,), dtype=numpy.int)\n"
"example.fill_increasing(z3, 0, 1)\n"
"print(z3)\n"
);
Py_Finalize();
}
但我收到错误:
TypeError:没有已注册的转换器能够从此类型为numpy.int32的Python对象中提取类型为int的C ++引用
它出现在我的stl_forward_iterator中的dereference函数中,我不知道如何解决这个问题。
如果在这种情况下可以提供帮助的东西不存在,我真的认为应该有一个作为建议,除非有不同的解决方案。
非常感谢任何帮助,谢谢。