gpt4 book ai didi

c++ - BGL 迭代宏、类型名和模板

转载 作者:行者123 更新时间:2023-11-30 03:45:54 25 4
gpt4 key购买 nike

在 bgl iteration_makros.hpp , 它说

Use the _T versions when the graph type is a template parameter or dependent on a template parameter. Otherwise use the non _T versions.

例如:

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

我看到的唯一区别是 _T 版本中的 typename 修饰符,而且 stackoverflow 足以在代码中突出显示这一点。

现在,我对整个类型名和模板这件事不是很了解,但为什么要提供两个版本呢?为什么 _T 版本不够用?谁能给我一个我不能使用 _T 版本的例子?

或者如果没有这样的例子,这背后的原因是什么?

在相关说明中,使用 BGL 的捆绑属性是否算作图形“依赖于模板参数”?

最佳答案

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

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

关于c++ - BGL 迭代宏、类型名和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34443818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com