簡體   English   中英

BGL迭代makros,類型名和模板

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM