mdl c++API和BOOST_AUTO&BOOST_FOREACH

本文介绍了在使用旧版编译器(如VS2005)时如何利用mdl C++ API和BOOST库中的BOOST_AUTO与BOOST_FOREACH特性。在遍历ElementAgenda时,通过BOOST_AUTO可以避免明确声明变量类型,简化代码。同时,指出使用agd.GetLast()并不等同于vector::end(),在遍历时需要注意。而BOOST_FOREACH虽然不支持所有容器,但在标准容器及其继承类中工作良好。建议参考BOOST的官方文档以获取更多信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++0X已经发布啦,如果你用的是旧编译器,好多东西用不上,如typeof和auto;

我用mdl C++ API还是VS2005,因为不想换别人的机子还带个10.0的运行时过去。

boost中的BOOST_AUTO在旧编译器上也可以使用auto的特性.

在遍历ElementAgenda的时候,才开始,可能不知道是声明一个什么变量,是EditElementHandl还是EditElementHandlP\还是ElemHandle,还是ElemHandleP,还是ElemAgendaEntry?还是……

下面是个例子,BOOST_AUTO优雅多了,简洁的代码像艺术。

#include <boost/foreach.hpp>
#include <boost/typeof/typeof.hpp>
#include <MicroStationAPI.h>
#include <BentleyNameSpace.h>
#include <MsFuncs.h>

void loopSelectElements()
{
	ElementAgenda agd;
	ISelectTool::GetTool().BuildAgenda(agd);
	EditElemHandleP firstElH = (EditElemHandleP)agd.GetFirst();
	for(int i = 0;i != agd.GetCount();++firstElH,++i)
	{
		mdlcout<<"Element Id:"<< firstElH->GetElemRef()->GetElemID()<<"  |  ";
		mdlcout<<"Element type:"<<firstElH->GetElemRef()->GetElemType()<<endl;
	}
}
void loopSelectEleByBoost()
{
	ElementAgenda agd;
	ISelectTool::GetTool().BuildAgenda(agd);
	BOOST_AUTO(firstElH,agd.GetFirstP());
	BOOST_FOREACH(*firstElH,agd)
	{
		mdlcout<<"Element Id:"<< firstElH->GetElemRef()->GetElemID()<<"  |  ";
		mdlcout<<"Element type:"<<firstElH->GetElemRef()->GetElemType()<<endl;
	}
}
extern"C" DLLEXPORT int MdlMain(
	int argc,
	char** argv)
{
	loopSelectEleByBoost();
	mdlDialog_cmdNumberQueue(false,CMD_MDL_SILENTUNLOAD,"mdlBoost",1);
	return true;
}


注意,ElementAgenda从stl::vector继承而来,agd.GetLast()并不是得到vector::end()的迭代器(而是vector.back()),所以它不是指向最后一个元素后面的那个位置,它真真切切是包含了一个有用的元素。所以遍历的时候,你如果这么写,就错了,导致最后一个元素你遍历不到:

void opSelectElements()
{
	ElementAgenda agd;
	ISelectTool::GetTool().BuildAgenda(agd);
	EditElemHandleP firstElH = (EditElemHandleP)agd.GetFirst();
	for(;firstElH != agd.GetLast();++firstElH)
	{
		……
	}
}
如果你采用下面的呢:

	for(;firstElH != agd.GetLast()+1;++firstElH)
	{
		……
	}
当agenda是空的时候,又错了,呵呵……

BOOST_FOREACH呢,它应该是用的基类中的标准函数(first() & end() )取得的标准迭代器进行的遍历,它一定不晓得还有Getlast()之类的函数,它只是个模板函数,并不支持所有的容器,但支持标准的容器和标准容器的继承类。

可以参考BOOST的文档,这些文档写的太棒了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值