> 道化師さん
情報ありがとうございました。このextended_stringは大技ですね。
basic_stringを拡張する方向はちょっとは考えたのですが、継承することを前提に設計されていないクラスを継承するのは凄い手間がかかりますので、私は3秒位で諦めてしまいました。しかし、このextended_stringをベースにすれば手が届きそうです。
とりあえず以下のようなテンプレート関数を追加し、
-----
template inline const T* null(void);
template<> inline const char* null(void) {return "";}
template<> inline const wchar_t* null(void) {return L"";}
-----
extended_stringのコンストラクタの1つを以下のように置き換えると、
-----
extended_string(const value_type *X,
const allocator_type &a = allocator_type())
:base_type(X ? X : null(), a) { }
}
-----
NULLを代入しても問題がない文字列クラスの出来上がりですね。
NULLを代入した文字列とNULLを==で比較したらどうなるべきで実際はどうなるんだろうとか色々怪しいところはありますが、ある程度割り切ればなんとでもなるでしょう。
ただ最大の問題は、extended_stringを導入しても、
_bstr_t bstr;
std::wstring wstr(bstr);
と書いたら実行時にエラーが出ることには変わりがない、ということです。
本当は_bstr_tの方を直すべきなんでしょうね。
随分前に
http://tricklib.com/cxx/dagger/xstring.h
なんてものを作ったんだけど、これなら std::basic_string<...> をちゃんと継承してるし、
もし、お気に召したらカスタムな俺std::basic_string<...>を作る時のベースなり参考なりにしてください。
wstrは変数なのでオーバーライドできません。
↓は、std::wstring型の変数wstrの定義です。
std::wstring wstr(safety(bstr));
safety関数を内蔵した変換関数をwstrにオーバーライドするとかできないものなのでしょうか?