Boost.Graph 方向性のカテゴリを取得する

グラフ構造を処理するために、アルゴリズム側で有向、無向、双方向の各分類で処理を分けたい場合があります。そんなときには、boost::graph_traits::directed_categoryで方向性を表す型を取得することができます。それを使ってオーバーロードすることもできます。

#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