拡張文字列クラスを更新しました。(マルチ文字列リテラル関連、他)

http://tricklib.com/cxx/dagger/xstring.h

更新内容は以下の通りです。

  • ただの npos だと mwcc2.4 でエラー になる箇所を base_type::npos に修正。
  • TX_string_literal_holder の蛇足な std::basic_string と std::basic_string への変換 operator() を除去。
  • マルチ文字列リテラル関連の比較演算子及び operator + () の実装。
  • マルチ文字列リテラルでnul文字を含む文字列リテラルの対応。
  • wxstring を disabled にしている場合でも _TX を使えるように修正。

..."マルチ文字列リテラルでnul文字を含む文字列リテラルの対応"により...

tricklib::xstring test_string(_TX("test\x0\x0"));

...といった形でnul文字を含む文字列リテラルを簡潔に拡張文字列リテラルに渡せますし...

tricklib::xstring test_string(_TX("test\x0\x0"));
if (_TX("test\x0\x0") == test_string) ...

...といった判定も正しく処理されます。

追記

ちなみに、Borland 系のコンパイラにはワイド文字列の sizeof が正しく取得できないというバグがあるのですが、これは UNICODE 上での文字コードが 0x100 以上となる文字が 4 バイトとして計算されるというもので、sizeof(L"テスト") は正しくは 8 を返さなければならないのに 14 を返してしまいます*1。今回の「マルチ文字列リテラルでnul文字を含む文字列リテラルの対応」でもこれがネックになりましたが、Borland 系のコンパイラではその補正を行う処理を挿入するようにしてこの問題を隠蔽しています。

*1:SJIS文字コードで確認を取りました