template の部分特殊化がよくわかりません(2)

とりあえず回避策を考える。
固定文字幅の型と可変幅文字の型を分けるか...

// 可変幅
template <class T, class U>
struct multibyte_char_traits
{
  typedef T min_char_width_type;
  typedef U max_char_width_type;
  typedef variable_char_width_type  char_width_type;
};
// 固定幅
template <class T>
struct singlebyte_char_traits
{
  typedef T min_char_width_type;
  typedef T max_char_width_type;
  typedef fiexed_char_width_type  char_width_type;
};

で、 iteratorインスタンス化はこうなるかな

typedef multibyte_char_traits<unsigned char, singed char> m_traits_type;
typedef char_iteartor<m_traits_type> m_iterator_type;

とか

typedef singlebyte_char_traits<char> s_traits_type;
typedef char_iteartor<m_traits_type> s_iterator_type;

で、Regex に食わす時は

typedef std::pair<m_iterator_type, m_iterator_type> range_type;

range_type range = パターン文字列の begin, end の対

Regex::Compiler<m_iterator_type> compiler;
Regex::Pattern<m_iterator_type>* pattern = compiler.Compile(range);

ここまで書いて気づいたが Singlebyte の時って別に iterator いらないよな。
生のポインタを渡せばいい。そのために iterator をテンプレート引数にしたんだし。

typedef std::pair<char, char> range_type;

range_type range;
range.first = パターン文字列の begin
range.second =	パターン文字列の end

Regex::Compiler<char> compiler;
Regex::Pattern<char>* pattern = compiler.Compile(range);

早く気づけよ、俺。 orz..