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的文档,这些文档写的太棒了。