我如何知道模板邻接列表中有哪些 Boost 图属性可用?

问题描述

考虑以下两个邻接表:

#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<Graph>::directed_category ),我持有一个布尔值,无论 Graph 类型的图是否有向,取自 this SO question

但是我如何读取有关图形类型属性的其他信息,尤其是图形定义了哪些内部/捆绑属性

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

我很感激任何提示

解决方法

我已经展示了大部分here

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

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


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

我很高兴在这里被证明是错误的,但我担心 BGL 在这里暴露了它的年龄。我不确定 c++20 std::detected<> 是否有任何新的/更好的东西。直觉上,我认为不会,因为这需要围绕 Sfinae 范围进行核心语言更改。