今天使用boost.python封装一个vector,出现了错误。
代码大致如下:
class Point
{
public:
Point( double xt , double yt ):x(xt) , y(yt){}
double getX(){ return x; }
double getY(){ return y; }
double x ;
double y ;
};
封装代码:
typedef vector<Point> PointList ;
BOOST_PYTHON_MODULE(PyDDA)
{
class_<Point>("Point" , init<double , double>())
.add_property("x" , &Point::getX)
.add_property("y" , &Point::getY)
;
class_<PointList>("pyvector")
.def( vector_indexing_suite<PointList> () )
.def( "size" , &std::vector<Point>::size);
;
}
提示错误:
error C2678: 二进制“==”: 没有找到接受“Point”类型的左操作数的运算符(或没有可接受的转换) c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm 41
在网上搜很久,最后发现,boost的官方示例里就有详细的使用方法。。。
具体位置:(boost安装目录)/libs/python/test/vector_indexing_suite.cpp
查看后,我明白了原因,vector对它所存储的元素有要求,比如,在使用find函数时要进行比较,所以这个Point需要给出operator==和operator!=的操作。知道原因后,修改代码:
class Point
{
public:
Point( double xt , double yt ):x(xt) , y(yt){}
bool operator==( Point const& t ) const { return t.x==this->x && t.y==this->y ; }
bool operator!=( Point const& t ) const { return t.x!=this->x || t.y!=this->y;}
double getX(){ return x; }
double getY(){ return y; }
double x ;
double y ;
};
然后一切运行正常。
在网上查阅信息时,还查到了boost的官方文档,这个在安装好的boost中也有,真远在天边,近在眼前。。。
具体位置:(安装目录)\libs\python\doc\v2\indexing.html
里面的信息告诉我们,boost.python给出了indexing_suite,可封装容器一部分操作,好处就不列举了,能提供的操作有:
__len__(self)
__getitem__(self , key)
__setitem__(self)
__delitem__(self)
__iter__(self)
__contains__(self)
果然非常方便。
但indexing_suite不能直接使用,使用前必须先对其针对相应的类进行封装,如果有兴趣可以尝试。
官方给提供了两个封装好的:vector_indexing_suite 和 map_indexing_suite