Mercury::Regexは「どんな文字型でも、どんなデータ構造でも使える」という触れ込みのテンプレートクラスですが、もちろんありとあらゆる型(クラス)やデータ構造を使えるわけではなく(少なくともC++では理論的に不可能ですよね)、一定の条件を満たす文字型・データ構造ならばどんな文字型でもデータ構造でも使えるという意味です。 ここでは、文字型とデータ構造がそれぞれ満たすべき条件を説明します。
文字型は、以下の条件を全て満たす必要があります。 条件は非常に緩く、あらゆる組み込み型が使える上に(bool型が使えても意味はないでしょうが)、文字を格納する事を想定して作ったクラスならほとんどのものが使えます。
例えば、次のようなクラスも文字型として使えます。
class character { public: character(const char ch = 0) { m_ch = ch; } void operator= (const character &rhs) { m_ch = rhs.m_ch; } bool operator==(const character &rhs) const { return m_ch == rhs.m_ch; } bool operator< (const character &rhs) const { return m_ch < rhs.m_ch; } private: char m_ch; };
メタ文字を返すクラスは、デフォルトでは次のように定義されています。 必要に応じて、独自に作成したものをbasic_regexの2番目の型として指定してください。
template<typename _Char> class regex_traits { public: static _Char escape (void) { return _Char('\\'); } static _Char disjunction(void) { return _Char('|'); } static _Char loop0 (void) { return _Char('*'); } static _Char loop1 (void) { return _Char('+'); } static _Char loop01 (void) { return _Char('?'); } static _Char group_begin(void) { return _Char('('); } static _Char group_end (void) { return _Char(')'); } };
文字列としてのデータ構造は、以下の条件のいずれか満たす必要があります。 文字型に比べると厳しい条件ですが、STLのコンテナに準拠した仕様となっているので戸惑うことはないと思います。
STLではstringやvectorはもちろん、list, deque等が使えます。 setもコンパイルエラーにはなりませんが、データを格納した時点で順序付けられている(=ソートされている)ので、文字列としては使えません。
begin(), end()を持っている場合はオブジェクトをそのままコンストラクタ等に入れればいいのですが、イテレータしか持っていない場合は先頭と末尾の1つ先のイテレータをこの順番で指定する必要があります。 実際のコードは使い方を参照してください。