boost.python vector_indexing_suite 使用注意事项

30 篇文章 1 订阅
7 篇文章 0 订阅

今天使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值