次のようなことができるマクロを作成しようとしています。FORMAT(a << "b" << c << d)
結果は文字列になります。これは、ostringstreamを作成し、を挿入a...d
して、を返すのと同じ.str()
です。何かのようなもの:
string f(){
ostringstream o;
o << a << "b" << c << d;
return o.str()
}
基本的に、FORMAT(a << "b" << c << d) == f()
。
まず、私は試しました:
1: #define FORMAT(items) \
((std::ostringstream&)(std::ostringstream() << items)).str()
最初の項目がC文字列(const char *
)の場合、文字列のアドレスを16進数で出力し、次の項目は正常に出力されます。最初の項目がである場合、std::string
コンパイルに失敗します(一致する演算子はありません<<
)。
これ:
2: #define FORMAT(items) \
((std::ostringstream&)(std::ostringstream() << 0 << '\b' << items)).str()
正しい出力のように見えますが、もちろん文字列に0
とが含まれています。\b
以下は機能しているようですが、警告付きでコンパイルされます(一時的なアドレスを取得):
3: #define FORMAT(items) \
((std::ostringstream&)(*((std::ostream*)(&std::ostringstream())) << items)).str()
1がc-stringのアドレスを出力し、?でコンパイルできない理由を誰かが知っていstd::string
ますか?1と3は本質的に同じではありませんか?
C++0xの可変個引数テンプレートがformat(a, "b", c, d)
可能になると思います。しかし、これを今解決する方法はありますか?