BGL迭代makros,类型名称和模板

时间:2015-12-23 21:13:27

标签: c++ templates boost

在bgl iteration_makros.hpp中,它说

  

当图表类型是模板参数或时,使用_T版本     取决于模板参数。否则使用非_T版本。

e.g:

#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__))

VS

#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的捆绑属性是否算作图表依赖于模板参数&#34;?

1 个答案:

答案 0 :(得分:2)

使用C ++ 03,typename关键字可以准确地被允许。也就是说,如果一个从属名称是一个类型,那就是必要的。如果类型不是从属名称,则不允许使用。因此,根据您是否在模板内,可能是允许的,也可能是必需的,也不是必需的。

使用C ++ 11时,在引用嵌套类型时总是允许typename关键字,即使用C ++ 11,不再需要两个版本和_T - 版本已经足够了。