operator<<
に書き込むために実装するユーザー定義型が大量にある場合std::ostream
。Pantheiosでタイプをログに記録するときに、これらをどのように使用できますか?
2 に答える
独自のデータ型に「シム」を提供する必要があります。これを行う方法に関するドキュメントのようです: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<<
きれいではありません。私は個人的にboost::lexical_castライブラリを使用して、ほとんどすべてのデータ型を、Pantheiosがネイティブにサポートするstd::stringデータ型に変換します。operator<<
したがって、クラスが定義されている場合は、次のpoint
ように入力するだけです。
pantheios::log_ERROR("Point: ", boost::lexical_cast<string>(point_object))
もちろん、これにはいくつかの注意点があります。多くの人がboost::lexical_castが遅いと不満を言っています。あなたはそれをグーグルして、同じことを話すいくつかの記事を見つけることができます(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>
しかし、一部の人が快適に使用できるよりも間接的です)。