2012-02-09 12 views
2

これはvariadicテンプレート、variadicマルコス、またはおそらくメタプログラミングによって達成できるかどうかわかりません。ロガーの引数の可変数を受け入れる

基本的に私はこのようなログオブジェクトがあります。

LOG << "This is the value of variable X: " << varaibleX; 

をしかし、私はまた、これは関数のよう

LOG ("This is the value of variable X: ", variableX); 

LOGを使用することができるようにしたいが、引数の数が変化することができます。 (電話でストリームに変換できると仮定した場合)

私はLOG (...)を見ていましたが、実際には引数を拡張する方法がわかりませんでした。

はそれでは、誰かが

LOG(X, Y, Z); 

を書いたとしましょう、私はにこれを拡張したい:

LOG << X << Y << Z; 

がこれを行うことができますか?

+1

「LOG( "Blargh:" << X << Y << Z)」はどうですか?単一の引数で、 'LOG'はあなたがログインしているものの背後にあるものを展開します。また、http://www.templog.org/をチェックしてください。 – Xeo

答えて

1

これは、以下のような可変テンプレートで行うことができます。そのあなたのLOGオブジェクトが何であるかをクリアしていないので、私は実際にLOG(...)を呼び出すコードを省略しますが、これはあなたが必要とする何ポートことができるようになります。

#include <iostream> 

/** 
* A specialization to stream the last argument 
* and terminate the recursion. 
*/ 
template<typename Stream, typename Arg1> 
Stream & DoLog(Stream & stream, const Arg1 & arg1) 
{ 
    return (stream << arg1); 
} 

/** 
* Recursive function to keep streaming the arguments 
* one at a time until the last argument is reached and 
* the specialization above is called. 
*/ 
template<typename Stream, typename Arg1, typename... Args> 
Stream & DoLog(Stream & stream, const Arg1 & arg1, const Args&... args) 
{ 
    return DoLog((stream << arg1), args...); 
} 

int main() 
{ 
    DoLog(std::cout, "First ", 5, 6) << " Last" << std::endl; 
} 

あなたがコンパイルする必要がありますこれはC++ 0xをサポートしています。 g ++では、--std = C++ 0xフラグを使用してこれを行うことができます。

+0

ええ、私はこれがうまくいくと思います。したがって、ログ機能は再帰的な関数呼び出しに変わります。 –