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オブジェクトを関数内で使うのにはうってつけ。