mdl c++API和BOOST_AUTO&BOOST_FOREACH

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

發佈了32 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章