テンプレート化されたコンテナー クラスであるという点で、boost::any に似たクラスがあります。含まれている値を文字列に書き込むメソッドが欲しいです。ただし、含まれている型がストリーム挿入演算子を提供しない場合、コンパイルに失敗するのではなく、メソッドがデフォルトの文字列を返すようにしたいと考えています。以下は私がやってきた限りであり、私がやろうとしていることを明確にする必要があります:
namespace W {
namespace hide {
template <typename T>
std::ostream& operator<<(std::ostream& out, const T& t) {
return std::operator<<(out, typeid(T).name());
}
}
template <typename T> struct C {
T t_;
std::string ToString() const {
using namespace hide;
std::ostringstream oss;
oss << t_;
return oss.str();
}
};
}
これはかなりうまく機能しますが、いくつかの注意事項があります。たとえば、クラスにオーバーロードされた挿入演算子を実際に提供したい場合、その演算子はクラスと同じ名前空間にあるか、考慮される W 名前空間にある必要があります。
また、char や std::string など、メンバー以外の std::operator<< を持つ型にも問題があります。T がこれらの型の 1 つである場合、oss << t_
上記の行はあいまいになります。これは、W 名前空間内にこれらの型のオーバーロードを追加することで回避できます。次に例を示します。
std::ostream& operator << (std::ostream& out, const std::string& s) {
return std::operator <<(out, s);
}
私の質問は、これよりも良い方法を見つけた人はいますか? std::string のようなものに独自のオーバーロードを追加する必要があるのはなぜですか? これはすべて標準に従ってサポートされていますか、それとも非標準の動作を利用していますか? (g++ 4.3.3 でテストしています)