3.5. デバッグ向け機能

コンテナに対する操作が正しいかどうかをチェックする手段のひとつとして、反復子にチェック機能を付加する方法が用意されている。

例えばvectorでは、ストレージポリシーに反復子に対する実行時チェックを行うポリシーを用いることで行う。次のように記述する。

例 3.13. 実行時チェック付きのvector

#include <bezel/vector.h>
#include <bezel/vector/storage_policy/checked_iterator.h>
#include <bezel/vector/storage_policy/default_selected.h>

void foo()
{
  using namespace bezel::vector;

  typedef vector<
    int,
    storage_is<
      storage_policy::checked_iterator<storage_policy::default_selected> >
  > C;

  ...
}

ストレージポリシーとして指定されているstorage_policy::checked_iteratorは、行われる操作を実行時にチェックする反復子を生成する: 定義外の範囲への移動、不正な位置での参照外し、無効化された反復子の使用、異なるコンテナから得られた反復子間の演算などは、エラーとして検出される [3] 。また、storage_policy::checked_iteratorはプロキシポリシーであるため、ここでは下位のストレージポリシーとしてstorage_policy::default_selected(デフォルトで選択されるストレージポリシー)を指定している。

ただし、チェック機能付き反復子は実行時の計算量が増加するため、本来なら定数時間で完了するはずの操作に線形時間を要するなどの副作用がある。デバッグ用途に限定して使用した方がよい。



[3] std::abortを呼び出してプログラムを停止させる。エラー処理の方法は変更できる: 詳細は項7.10.3.3. 「storage_policy::checked_iteratorを参照のこと