2010-11-17-01-文字コードの話 - 15 - project-enigma

2010-11-17-01-文字コードの話 - 15

>> Site top >> weblog >> 月別アーカイブ >> 2010年11月のlog >> 2010-11-17-01-文字コードの話 - 15

最終更新日付:2013/12/31 07:35:47


文字コードの話 - 15

2010 年 11 月 17 日

余談は続く。

イテレータの導入と仕様の変更に追従する作業をしていると、対応に手間がかかるパターンが見えてくる。たとえば以下のようなコードの置き換えだ。

 const char*  pData;
     :
     :
  if( *(pData+1) == 'a' )

現状では反復子は operator+ をサポートしていないから、これを単純なかたちで反復子の使用に変更できない。++演算子で移動し、文字値を取得して再び元の位置に戻すというステップを踏まなければならない。指定した文字数分移動した反復子を返すフリー演算子をサポートするかどうか.悩むところだ。

現状では、この反復子をポインタのように扱うには以下の演算子オーバーロードが欠落している。

後置インクリメント/デクリメント演算子をサポートできない理由は以前書いたとおりだ。これについてはもう諦めているので、今後もサポートする予定はない。それ以外の演算子については、指定する値が文字数なのかバイト数なのか直感的にわかり難いという理由でサポートを見送っている‥‥‥といっても operator+=( int ) はサポートしているのでおかしいと言えばおかしいのだが。

ただ、この反復子は const char* へのキャスト演算をオーバーロードしているので、整数値との加減算はそのままコンパイルに通ってしまうかもしれない。そう考えると、どちらの仕様であれ明示的にオーバーロードするべきということになる。

しかし、いきなりオーバーロードの実装を用意するのも考えものだ。というのは、既存のコードの中で文字数単位でなくバイト数単位での相対位置取得を目的としたコードがあるかもしれない。その場合、operator+ のサポートとともに問題の個所のポインタを反復子に置き換えるとプログラムの意味が変わってしまう。おそらく、perator+ を privateで宣言しておき、いったん全ての個所でコンパイルエラーにするのが安全だろう。そしてそれぞれの個所でバイト数単位なのか文字数単位なのかを明らかにし、必要な対処をした後で改めて public 宣言に戻す、と。

実は、今回の記事をアップロードした時点で operator+ と operator[ ] は実装が済んでしまっている。上の文章は実装前に書いたものだ。実際、冒頭のようなコードと同等の簡潔さで反復子を使えるようになった。

メンバ関数や演算子オーバーロードについてはそろそろ固まってきたと思う。でもまだ書くことがある。あと1〜2回かな。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : 開発

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.