1

operator<<に書き込むために実装するユーザー定義型が大量にある場合std::ostream。Pantheiosでタイプをログに記録するときに、これらをどのように使用できますか?

4

2 に答える 2

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);

幸運を!

于 2010-12-02T13:30:59.570 に答える
1

再利用できる方法はありますが、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>しかし、一部の人が快適に使用できるよりも間接的です)。

于 2010-12-27T07:15:41.410 に答える