グラフ構造を処理するために、アルゴリズム側で有向、無向、双方向の各分類で処理を分けたい場合があります。そんなときには、boost::graph_traits
#include <iostream> #include <boost/graph/adjacency_list.hpp> // 有向 template <class Graph> void dispatch(const Graph& g, boost::directed_tag) { std::cout << "directed" << std::endl; } // 無向 template <class Graph> void dispatch(const Graph& g, boost::undirected_tag) { std::cout << "undirected" << std::endl; } // 双方向 template <class Graph> void dispatch(const Graph& g, boost::bidirectional_tag) { std::cout << "bidirectional" << std::endl; } template <class Graph> void dispatch(const Graph& g) { typedef typename boost::graph_traits<Graph>::directed_category tag; // タグを取得 dispatch(g, tag()); } int main() { { boost::adjacency_list<boost::listS, boost::vecS, boost::directedS> g; dispatch(g); } { boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS> g; dispatch(g); } { boost::adjacency_list<boost::listS, boost::vecS, boost::bidirectionalS> g; dispatch(g); } }
directed undirected bidirectional