私たちのプロジェクトでは、マクロを使用して、次のように1行のステートメントでロギングを簡単かつ簡単にします。
DEBUG_LOG(TRACE_LOG_LEVEL, "The X value = " << x << ", pointer = " << *x);
マクロは2番目のパラメーターをstringstream引数に変換し、それを通常のC++ロガーに送信します。これは、マルチパラメータのロギングステートメントを非常に簡潔にするため、実際にはうまく機能します。ただし、Scott Meyersは、Effective C ++ 3rd Editionで、「インライン関数のテンプレートを使用することで、マクロのすべての効率に加えて、通常の関数のすべての予測可能な動作と型安全性を得ることができます」と述べています(項目2)。予測可能な動作に関連するC++でのマクロの使用には多くの問題があることを知っているので、コードベースでできるだけ多くのマクロを排除しようとしています。
私のロギングマクロは次のように定義されています:
#define DEBUG_LOG(aLogLevel, aWhat) { \
if (isEnabled(aLogLevel)) { \
std::stringstream outStr; \
outStr<< __FILE__ << "(" << __LINE__ << ") [" << getpid() << "] : " << aWhat; \
logger::log(aLogLevel, outStr.str()); \
}
私はこれをマクロを使用しないものに書き直すことを何度か試みました。
inline void DEBUG_LOG(LogLevel aLogLevel, const std::stringstream& aWhat) {
...
}
と...
template<typename WhatT> inline void DEBUG_LOG(LogLevel aLogLevel, WhatT aWhat) {
... }
役に立たない(上記の2つの書き換えのいずれも、最初の例のロギングコードに対してコンパイルされません)。他のアイデアはありますか?これはできますか?それとも、マクロのままにしておくのが最善ですか?