とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

Concept Check Libraryを使おう (2)

boost 1.41.0 コンセプトチェックライブラリの iterator archetype classes の紹介。もといメモ。
以下のクラスはイテレータんのコンセプトを満たしているだけのクラスです。実際にはまともな仕事をしないダミーのクラスと言えます。

// boost/concept_archetype.hpp

  template <class T, int I = 0>
  class input_iterator_archetype

  template <class T>
  class input_iterator_archetype_no_proxy

  template <class T>
  struct output_proxy

  template <class T>
  class output_iterator_archetype

  template <class T>
  class input_output_iterator_archetype

  template <class T>
  class forward_iterator_archetype

  template <class T>
  class mutable_forward_iterator_archetype

  template <class T>
  class bidirectional_iterator_archetype

  template <class T>
  class mutable_bidirectional_iterator_archetype

  template <class T>
  class random_access_iterator_archetype

  template <class T>
  class mutable_random_access_iterator_archetype

何に使うかというと,例えばイテレータアダプタを自作してる時に,受け取る型(ここでは class Iterator)の最小コンセプトをチェックすることができます。

template<class Iterator>
 class MyIteratorAdaptor
{
 Iterator iter_;
 /* ここで正しく実装済み */
};

#include<boost/concept_archetype.hpp>
int main()
{
 MyIteratorAdaptor<boost::random_access_iterator_archetype<int> > a;
 MyIteratorAdaptor<boost::bidirectional_iterator_archetype<int> > d;
 MyIteratorAdaptor<boost::forward_iterator_archetype<int> > c; // ここでコンパイルエラー
}

上のコードでコンパイルエラーが出たとします。そこから分かることは,MyIteratorAdaptor が受け取るイテレータは少なくとも bidirectional_iterator 以上でなければならない,ということです。
これが妥当な結果なら,「受け取る Iterator は bidirectional_iterator 以上」という仕様になりますし,そうではなく「受け取る Iterator は forward_iterator 以上」という一段階ゆるい仕様にしたければ,コンパイルエラーが出ないように,MyIteratorAdaptor を修正します。
concept_archetype.hpp 内には他にも一般的なコンセプトを満たした(だけの)クラスがあります。それらもコンセプトチェックに有効活用できるはずです。
Boost Concept Checking Reference