2012-02-24 8 views
2

私は可変パラメータを受け付けるロギング関数を持っています。これは、アンドロイドロギングとprintfのためにうまく動作しますが、私はstd :: coutとファイルストリームで同じことをしたいです。これを簡単に解決できる方法はありますか?C++可変長関数とcout

void LogManagerImpl::LogInfo(const char* msg, ...) 
    { 
     va_list argptr; 
     va_start(argptr, msg); 

     /* Log to stdout */ 
     if (mLogToStdOut) 
     { 
      #ifdef ANDROID 
       __android_log_vprint(ANDROID_LOG_INFO, __ENGINE_LOG_TAG, msg, argptr); 
      #elif defined _WIN32 || _WIN64 
       //printf ("%s:%s",__ENGINE_LOG_TAG,"INFO:"); vprintf(msg, argptr); printf("\n"); 
       // how do I do the same as above except with for example std::cout? 
      #endif 
     } 

     /* Log to file */ 
     if (mLogToFile) 
     { 
         // TODO 

     } 

     va_end(argptr); 
    } 
+0

Variadric parameters? –

答えて

2

は、まさにこのようなvprintf/vnsprintfように、対応するCのAPIを使用して、C++のストリームのための可変引数のラッパーを使用しないでください。このようにストリームをラップすると、すべてのメリットが捨てられ、複雑さが増します。

ラッパーAPIにストリームを使用させないようにして、Androidプラットフォームのprintfにマップするのはいかがですか。そうすれば、ストリームのメリットをすべて得ることができ、ネイティブストリームをサポートしていないプラットフォームでのみストリームを失うことになります。

+0

しかし、私は同じ問題に直面していますが、それ以外のところは同じです。どのようにすべての '<<'入力を受け取り、Android用の適切なフォーマットですか、la printf()ですか? – KaiserJohaan

+0

stdio関数を使ってストリームライブラリを使用するだけですか?ロケール置換を使用する単純なバージョンのIOストリームは、あまり問題にはなりません。 –

関連する問題