【问题标题】:How Can I Know Which Boost Graph Properties are Available in a Template Adjacency List?我如何知道模板邻接列表中有哪些 Boost Graph 属性可用?
【发布时间】:2021-07-03 06:28:47
【问题描述】:

考虑以下两个邻接列表:

#include <boost/graph/adjacency_list.hpp>

using Graph_1 = typename boost::adjacency_list<boost::vecS,
                 boost::vecS,
                 boost::directedS,
                 boost::no_property,
                 boost::property<boost::edge_weight_t, double> >;
Graph_1 graph_1(0);

struct VertexBundle { int some_int; };
struct EdgeBundle { double weight; };
struct GraphBundle { std::string name; };

using Graph_2 = typename boost::adjacency_list<boost::listS,
                 boost::listS,
                 boost::undirectedS,
                 VertexBundle,
                 boost::property<boost::edge_index_t, double, EdgeBundle>,
                 GraphBundle>;
Graph_2 graph_2(0);

它们的容器、有向类别以及为顶点、边和图形定义的属性不同。

现在,例如boost::detail::is_directed( boost::graph_traits&lt;Graph&gt;::directed_category ),我持有一个布尔值,无论Graph 类型的图是否有向,取自this SO question。

但是我如何才能读出有关 Graph Type 的属性的其他信息,尤其是该图定义了哪些内部/捆绑属性?

我找到了this boost docs page on graph_traits,但我不太了解它。对于初学者来说,boost graph 文档有点难以阅读……

感谢任何提示!

【问题讨论】:

    标签: c++ templates boost boost-graph adjacency-list


    【解决方案1】:

    我已经展示了大部分 here。

    但是我确实注意到我犯了一个错误:我将 boost::graph_property&lt;Graph, Tag&gt; 特化到了应该是 boost::property_map&lt;Graph, Tag&gt; 的地方。见https://www.boost.org/doc/libs/1_64_0/libs/graph/doc/property_map.html

    您可以选择 SFINAE 或 get(property_tag_t{}, graph) 的结果。


    看起来property_map 甚至可能对sfinae 不太友好——也许它在急切地实例化细节时很难失败。嗯。这意味着你“不能”——你只需要总是为任何可选的属性映射获取参数,并将它们默认为库实现。那样的话,如果人们没有在他们应该提供的时候提供一个,它就会发出硬编译器错误

    我很高兴在这里被证明是错误的,但我担心 BGL 在这里已经过时了。我不确定c++20 std::detected&lt;&gt; 是否有任何新的/更好的东西。直觉上,我认为不会,因为这需要围绕 Sfinae 的范围进行核心语言更改。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多