meryngii.neta

今日も新たな"ネタ"を求めて。

basic_string

C++の文字列処理は、何かと評判が悪い。

template <class charT, class traits = char_traits<charT>,
	  class Allocator = allocator<charT> >
class basic_string;

typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;

批判はいろいろあるようだが、まず文字列を操作する関数が少ないことだ。文字列を文字列で置き換える関数などがない。boost::string_algoを使えばいいのだが、標準ではない。C++0xに入るのは難しいだろう。
テンプレートで定義されていることも問題になる。テンプレートの実装はコンパイラによってまちまちなので、互換性がない。複数のコンパイラをまたぐものを作るときにこれが問題になる。しかし、これは言語に解決を求めることは難しいだろう。メンバの配置すら規定されていないのだから、結局ABIで定義するか、もしくは、OSに付属する文字列クラスを使うしかないだろう。
日本語の扱いも面倒だ。ストリームなどにはwchar_tに対応していないものがあるし、そもそもwchar_t自体も評判が良くない。C++0xでchar8_tとchar16_tで改善されることを期待したい。
長い文字列(rope)や、読み取り専用クラス(.NETのSystem.String)など、特殊用途のための文字列クラスも無い。そもそも文字列は、.NETやJava(?)のように読み取り専用を基本にした方がいいのかもしれない。すでにある仕様は変えられないわけだけれども…。