[英]BGL iteration makros, typenames and templates
在BGL iteration_makros.hpp ,它說
當圖形類型是模板參數或依賴於模板參數時,請使用_T版本。 否則,請使用非_T版本。
例如:
#define BGL_FORALL_EDGES_T(ENAME, GNAME, GraphType) \
for (std::pair<typename boost::graph_traits<GraphType>::edge_iterator, \
typename boost::graph_traits<GraphType>::edge_iterator> BGL_RANGE(__LINE__) = edges(GNAME); \
BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
for (typename boost::graph_traits<GraphType>::edge_descriptor ENAME; \
BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true):false; \
++BGL_FIRST(__LINE__))
與
#define BGL_FORALL_EDGES(ENAME, GNAME, GraphType) \
for (std::pair<boost::graph_traits<GraphType>::edge_iterator, \
boost::graph_traits<GraphType>::edge_iterator> BGL_RANGE(__LINE__) = edges(GNAME); \
BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
for (boost::graph_traits<GraphType>::edge_descriptor ENAME; \
BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true):false; \
++BGL_FIRST(__LINE__))
我看到的唯一區別-和stackoverflow足以在代碼中突出顯示-是_T版本中的typename
修飾符。
現在,我對整個類型名和模板並不太熟悉,但是為什么要提供兩個版本呢? _T版本為什么不夠? 有人可以給我一個不能使用_T版本的示例嗎?
或者,如果沒有這樣的例子,這背后的原因是什么?
在相關說明中,使用BGL的捆綁屬性是否算作Graph的“取決於模板參數”?
使用C ++ 03時,可以在需要的位置精確地輸入typename
關鍵字。 也就是說,如果從屬名稱引用類型,則很有必要。 如果類型不是從屬名稱,則不允許該類型。 因此,取決於您是否在模板中,可以允許和需要模板,也可以不要求模板和模板。
對於C ++ 11,在引用嵌套類型時始終允許使用typename
關鍵字,即,對於C ++ 11,不再需要兩個版本,並且_T
-version就足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.