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的文檔,這些文檔寫的太棒了。