2011-07-26 11 views
4

私のC++アプリケーションのリファクタリングが進行中です。 +さらに停止、彼らは起動時に特定のアクション(すなわちの「自動」のログを取得するためにC++でのカスタムログインの方法

Log(std::string _init_message): 
    init_message(_init_message) 
{ PrintLogLine(init_message + " ...");} 
~Log() 
{ PrintLogLine(init_message + " done.");} 

:私は

LOG("something interesting") // 1 
LOG("something ended")  // 2 
LOG("foo: " << bar)   // 3 

のようなマクロを使用する前に、私の考えは、今ではのようなLogクラスを記述することでしたタイミングなど)。

void ActionXYZ() { 
    Log log("xyz"); 
    // do stuff 
} 

私が苦労しているのは、ケース3)で動作させる方法を定義することです。 Javaでは、コンパイラが自動的に文字列の作成を行うので、1つのString引数を取るメソッドを使用できます。私はC++でどのような可能性を持っていますか?

いずれかのオプションのように使用できるように機能させることはできますか?

// in "do stuff" 
log("foo:" + bar); // OR 
log << "foo:" << bar; 

答えて

3

コメントで触れたように、Boost.Formatを使用できます。また、.str()std::stringコンストラクタに呼び出すことを避けるために、boost::formatを直接受け入れるようにすることもできます。これは、int-to-stringコンバージョンなどの問題に役立ちます。

Log log(boost::format("foo %1% bar") % 42); // with Log(boost::format) 
Log log((boost::format("foo %1% bar") % 42).str()); // with only Log(std::string) 

詳細はBoost.Format documentationを参照してください。

1

すぐれた可能性が2つあります。最初はSTD ::文字列の添付を利用することである。

Log log("foo:", bar); 
+1

またはBoost.Format。 –

+0

私は既に最初のオプションを試しましたが、その適用性は限られています。この 'log(std :: string(" foo: ")+ 2 +" units ");'はコンパイルされません... – dcn

+0

@dcn、あなたは元の質問でそれを言及しておきました。 –

0

あなたが本当にあなたのロギング用Boost.Logを使用して検討する必要があります。

Log log(std::string("foo:") + bar); 

第二は、追加のパラメータを取るよりlogコンストラクタを作ることです。ロギングは複雑なことです。完全に形成された実装を得ることは有益です。

0

std :: strstreamから継承するログクラスを作成できます。

class Mstream : public std::strstream 
{ 
    public: 
    Mstream() : std::strstream(Buffer = new char[BUFLEN], BUFLEN, ios::out); 
    ostream& endf(ostream& s); 
    void Write(); 

    private: 
    char* Buffer; 
}; 

今、あなたに出力を記録することができ、ENDFで

Mstream m; 
m <<"Foo"<<s<<endf; 

(&のostream)のあなたは)(Mstreamへのostreamをキャストし、書き込みを呼び出すことができます。 Write()では、出力を書式設定し、コンソールまたはファイルに出力します。

関連する問題