【问题标题】:BGL iteration makros, typenames and templatesBGL 迭代宏、类型名和模板
【发布时间】:2023-03-06 06:32:02
【问题描述】:

在 bgl iteration_makros.hpp 中,它说

当图形类型是模板参数或 依赖于模板参数。否则使用非 _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++ templates boost


    【解决方案1】:

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

    对于 C++11,typename 关键字在引用嵌套类型时始终是允许的,即,对于 C++11,不再需要两个版本,_T-version 就足够了。

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多