gpt4 book ai didi

c++ - 使用模板类 boost python

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:28 24 4
gpt4 key购买 nike

我创建了一个环形缓冲区,我想使用 boost 将该类导入 Python。当我尝试这样做时,它会出错。

ring.cpp: In function ‘void init_module_ring()’:
ring.cpp:130:16: error: wrong number of template arguments (1, should be 4)
class_<Ring>("Ring").Please help me. Thanks in Advance.

这是我的代码:

#include <boost/python/def.hpp>
#include<iostream>
using namespace std;
using namespace boost::python;


template <class T>
class Ring
{
public:
class iterator;
public:
unsigned int m_size;
unsigned int pos;
T *val;
Ring():
m_size(0),pos(0),val(NULL){};
Ring(int size):m_size(size),pos(0){
val=new T[m_size];
};
Ring(const Ring &other)
{
this->m_size = other.m_size;
this->pos= other.pos;
this->val = other.val;

}
~Ring()
{
delete[] val;
}
void insert(T data)
{
val[pos]= data;
pos++;
if(pos==m_size)
pos=0;

}
void displayall()
{
for(int i =0;i<m_size;i++)
{
cout<<val[i]<<' ';
}
}
iterator begin()
{
return iterator(val);
}
iterator end()
{
return iterator(val + m_size);
}
unsigned int size()
{
return m_size;
}
void check()
{
cout<<val<<' ';
cout<<val+5;
}
};
template<class T>
class Ring<T>::iterator
{
T *it_value;
public:
iterator():it_value(NULL){};
iterator(T *value)
{
it_value = value;
};
iterator(const iterator &other)
{
this->it_value = other.it_value;
}
friend ostream& operator<<(ostream &out,iterator it)
{
out<<*it.it_value;
return out;
}
iterator operator++()
{
it_value +=1;
return (iterator(it_value));
}
iterator operator++(const int x)
{
it_value = it_value+ x+1;
return(iterator(it_value));
}
bool operator==(const iterator &other) const
{
return (*it_value == *(other.it_value));
};
bool operator!=(const iterator &other) const
{
return (!(*this == other));
};
iterator operator*()
{
return *this;
}
void display()
{
cout<<*it_value<<' ';
}
};

BOOST_PYTHON_MODULE(ring)
{
class_<Ring>("Ring")
template <class T>
.def(init<int>())
.def("insert", &Ring::insert)
.def("display_all", &Ring::displayall)
;
}

最佳答案

模板不是类。您需要实例化您的模板(即 Ring<int> 而不是 Ring )。

class_<Ring<int>>("IntRing", init<int>())
.def("insert", &Ring<int>::insert)
.def("display_all", &Ring<int>::displayall)
;

另外,template <class T>加入您的原始代码:

class_<Ring>("Ring")
template <class T> // error
.def(init<int>())
.def("insert", &Ring::insert)
.def("display_all", &Ring::displayall)
;

是语法错误。它表明您希望能够以通用方式绑定(bind)到模板,不幸的是,这是不可能的。原因是模板是在编译时实例化的,即编译器需要知道模板将要使用的确切类型。如果你正在与 python 交互,你无法提前知道,因为它是在运行时决定的。

在幕后,Boost.Python 生成包装函数,这些函数采用 PyObject来自 python 的 s 并将它们转换为参数的强类型值(并将返回值返回到 PyObject s)。它之所以能够做到这一点,是因为它知道将动态值转换为/自的类型。

你能做的最好的事情就是创建一个非通用的类,而是使用 python objects 操作.

编辑:针对您的评论(“错误:未在此范围内声明‘init’”),我认为问题在于您只包含一个 Boost.Python header 。 #include <boost/python.hpp>或包括您需要的所有其他部分(一个是 init.hpp)。

关于c++ - 使用模板类 boost python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37111915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com