非常にうまく機能するソリューションに加えて、#define
テンプレートを使用した代替案を提示したいと思います
template<bool B>
void log(std::string message){}
template<>
void log<true>(std::string message){log_internal(message);}
#define DEBUG true
#define COMMUNICATION false
...
log<DEBUG>("this message will be logged");
log<COMMUNICATION>("this message won't");
この#define
ソリューションは、ほとんどの場合に非常に優れていますが、このソリューションを使用する理由がいくつかあります。
クラリビーに - あなたのコードはコンパイルして動作するかもしれません
LOG(std::cout << "Here!" << endl);
この特定のログがオフになっているためです。しかし、今から 2 年後のある日、誰かがロギングをオンにしていたるendl undefined
ところでエラーが発生します。さらに悪いことに、ロギングをオンにすると、かなり前になくなったライブラリへのリンクが突然必要になったり (ロギングがこのライブラリで定義された関数を特別に呼び出していたため)、以前からインターフェイスが変更されていた (または完全に削除されていた) 関数を使用していることに気付くかもしれません。実話 :( )
編集
これを回答に追加するように求められました:
ログに記録しない場合 (空の関数)、関数呼び出しのオーバーヘッドがあるように見えるかもしれません。コンパイラが最適化するため、これは当てはまりません。これを確実にしたい場合はinline
、関数にディレクティブを追加してください。
また、文字列コンストラクターが呼び出されないようにするために、これを anstd::string
から aに変更することもできますが、これもコンパイラーによって自動的に最適化される必要があります。const char *
とにかく、私が言ったように、これは本質的に解決策よりも優れているわけではありません#define
。実際、私はまだ#define
自分のプロジェクトで を使用していますが、このテンプレート ソリューションが望ましい特定の例がいくつかあります。