C++Builder2009の新機能 その4(TStringBuilder&boostのスマートポインタ編)

VCLに追加されたTStringBuilderを試してみたけど、Appendメソッドに文字列リテラルを渡すと微妙にやばいかも。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  boost::scoped_ptr<TStringBuilder> pBuffer(new TStringBuilder());

  pBuffer->Append("123");   // TStringBuilder::Append(const bool Value)が呼ばれる
  pBuffer->Append(L'|');    // TStringBuilder::Append(const System::WideChar Value)
  pBuffer->Append(L"345");  // やっぱりTStringBuilder::Append(const bool Value)が呼ばれる
  pBuffer->Append('|', 1);
  pBuffer->Append("678", 0, 3);
  pBuffer->Append('|', 1);
  pBuffer->Append(UnicodeString("abc"));  // UnicodeStringはおk。

  //boost::scoped_ptr<TStringBuilder> pBuffer2 = pBuffer;  // コピー不可なのでコンパイル時にエラー

  ShowMessage(pBuffer->ToString());
}

実行結果はこんな感じ。

TStringBuilderのAppendメソッドに、Append(const char* Value)とAppend(const wchar_t* Value)が無いから、関数オーバーロードの選択でAppend(const bool Value)が呼ばれる模様。これ、バグなのか仕様なのかよく判らん。
文字列リテラルをUnicodeStringとして渡せば問題ないから、「仕様」扱いかな・・・。

あと、VCLオブジェクトを関数内で使う場合、律儀にnew/deleteをするか、auto_ptrを使うのが一般的だったけど、C++Buider 2009からboostが標準添付されたので、boost::scoped_ptrが使用可能。scoped_ptrは、スコープが終了すると自動的にdeleteをし、かつ、ポインタのコピーを出来なくしているから、VCLオブジェクトを関数内で使うのにはうってつけ。