あめだまふぁくとりー

Boost.Graphとかできますん

using declaration使えばいいじゃない

アホな話

まえがき

BGLのアルゴリズムを適用できるグラフ構造にはBGLに含まれているadjacency_list等だけでない.自分自身で定義したグラフクラスやBoost以外のライブラリのグラフクラス,さらにvectorや配列等までありとあらゆるものBGLのアルゴリズムに適用できる.しかしそのためにはちょっとした準備が必要となる.アルゴリズムはこれらありとあらゆるデータ構造の情報にアクセスするために,verticesやout_edges等の自由関数を用いる.つまり必要な準備の一つとして,それぞれのデータ構造をBGLのグラフとして扱うにはこれらの自由関数を定義する必要があるのだ.このことはexternal adaptationと呼ばれている.

本論

自身で定義したクラス用のvertices等のアダプタ関数はそのクラスで定義した名前空間で定義されるのが普通なので,アルゴリズム内ではvertices等の自由関数を修飾なしで呼ぶ.対して他のグラフライブラリやvector等のアダプタ関数はboost名前空間にオーバロードすることになる.これで問題なくアダプタ関数を呼べることとなる.

では次に自分でBGLのコンセプトを満たすアルゴリズムを作るときアダプタ関数をどう呼び出すのか.自分で定義したアルゴリズムはboostでない名前空間に定義するので,boost修飾なしで呼び出すとvector等が呼び出せない.でもboostをつけるとADLでの呼び出しができない.
むむむ…これじゃ駄目じゃないですか!やだーーー!
とか思っていたのですが,ADL等の話を見てたらusing boost::verticesとか書いて修飾なしで呼べばいいことに気がつきました.駄目なのは自分の頭ですね.というかこのことEffective C++で読んだばっかりだったのに….
というわけで今からusing declarationを入れる作業にはいる