std::ostream
に書き込むために、operator<<
を実装する1トンのユーザー定義型がある場合。 Pantheiosで自分のタイプをログに記録するときに、どのようにこれらを使用できますか?Pantheiosでロギングするときに既存の演算子<<オーバーロードを使用する方法は?
答えて
よく、あなたはoperator<<
を再利用できる方法がありますが、それほど美味しくありません。私は個人的にboost :: lexical_castライブラリを使用して、ほぼすべてのデータ型をPantheiosがネイティブにサポートするstd :: stringデータ型に変換します。あなたがpoint
クラスに定義operator<<
を持っているのであれば、あなたは、単に入力できます。もちろん、これでいくつかの注意点があります
pantheios::log_ERROR("Point: ", boost::lexical_cast<string>(point_object))
。多くの人がboost :: lexical_castが遅いと不平を言う。あなたはそれをGoogleにして、同じことを話す記事を見つけることができます(http://stackoverflow.com/questions/1250795/very-poor-boostlexical-cast-performance、http://accu.org/index.php/journals/1375)。 Pantheiosが優れたパフォーマンスを誇っていることを考えると、その利点の一部を失う可能性があります。また、boost :: lexical_castを追加すると、プロジェクトに数百のヘッダファイルを追加することができます。また、コンバージョンごとに多くの文字(boost :: lexical_castなど)を入力する必要があります(マクロでこれを最小限に抑えることができます - #define BLCS boost::lexical_cast<string>
)。
独自のデータ型には「シム」を指定する必要があります。これを行う方法に関するドキュメントは次のとおりです:http://www.pantheios.org/tutorials_code.html#types_without_shims。例:この場合
namespace stlsoft
{
inline stlsoft::shim_string<char> c_str_data_a(Point const& point)
{
stlsoft::shim_string<char> s(101);
int cch = ::sprintf(s, "{%d, %d; area=%d}",
point.x, point.y, point.x * point.y);
s.truncate(static_cast<size_t>(cch));
return s;
}
inline size_t c_str_len_a(Point const& point)
{
char buff[101];
return static_cast<size_t>(::sprintf(&buff[0], "{%d, %d; area=%d}",
point.x, point.y, point.x * point.y));
}
} // namespace stlsoft
、タイプは、ログステートメントに直接渡すことができます。
pantheios::log_ERROR("Point: ", point);
幸運!
お返事ありがとうございます!しかし、これが唯一のオプションであれば、私はoperator <<を直接使用できる別のフレームワークを使用します。これらのすべての機能を再実装する時間はありません。 – Danvil
おそらく、あなたのタイプを受け入れる上記のテンプレート関数を定義することができます。これらの関数は 'operator <<'と 'std :: ostringstream'を利用できます。それらをあなたの型名前空間の中に入れてください。 –
Pantheiosサイトで機能リクエストをしてみませんか? Pantheiosの主な作者は、STLSoftをしている人、そしてShimsのアイデアを思いついた人です。誰かがすぐにそれをやることができれば、彼は一人だ。彼は要求にかなり反応すると思う。 – dcw
- 1. <<演算子とC++の文字列のオーバーロード+演算子
- 2. オーバーロード演算子<<返すのostream&
- 3. Groovy、ZipOutputStreamで<<演算子をオーバーロード
- 4. オーバーロード比較です演算子「無効な演算子は、<」
- 5. 演算子<<のオーバーロード - Javaの
- 6. 友人演算子<<テンプレートクラスのオーバーロード
- 7. 演算子のオーバーロード<<ネームスペース対
- 8. C++で「<<」演算子を正しくオーバーロードする方法は?
- 9. 演算子<< enum型の演算子<<は、オーバーロードされた演算子を使用しているかどうかを示します。
- 10. C++の配列の演算子<<をオーバーロードする方法は?
- 11. C++ ostream演算子<<オーバーロード
- 12. ostream演算子<< pimplクラスのオーバーロード方法
- 13. ポインタのベクトル構造体に対するオーバーロード演算子<<?
- 14. オーバーロード時にスタックオーバーフローが発生する<<演算子
- 15. "<<"演算子をオーバーロードできません
- 16. <<演算子をオーバーロードしてstd :: listを出力する
- 17. <<演算子をどのようにオーバーロードしますか?
- 18. は、<<のstd演算子のオーバーロード:: ostreamに
- 19. これをオーバーロードに渡す<<演算子
- 20. C++スタイル:演算子のオーバーロード、<flavor>
- 21. Rで%<>%演算子を使用する方法
- 22. 演算子<<オーバーロードが他のものを隠す
- 23. Googleのテストと演算子<< STL型のオーバーロード
- 24. CArchive <<演算子をstd :: stringを処理するためにオーバーロードすることはできますか?
- 25. <<演算子と継承クラスのオーバーロード
- 26. テンプレート型のオーバーロード解決と演算子<<に関する問題
- 27. C++ - アルファベット文字列 - '<'演算子オーバーロード
- 28. 演算子オーバーロードが<<データベースと呼ばれる別々のクラスでは
- 29. 演算子<<オーバーロード中エラー>>「const ....」を渡す
- 30. 挿入演算子のオーバーロードにはどのような問題がありますか? (<<演算子)
同じ名前空間にあることを確認してください。これにより、ADLがキックインできるようになります。 –
@Daniel:std :: ostreamなどを処理できるバックエンドは表示されません...? – Danvil