constexpr で printf デバッグ

constexpr でも printf デバッグをやりたいことは稀によくあるんですが、そのたびに constexpr を付けたり、関数内のコードを消したりするのは手間だよねーって事でちょっと考えてみた。

[ソース]

#include <iostream>

// constexpr でない場合は定義しない
// #define USE_CONSTEXPR

#ifdef USE_CONSTEXPR
#    define CONSTEXPR constexpr
#    define CONSTEXPR_DEBUG_SCOPE(...)
#else
#    define CONSTEXPR
#    define CONSTEXPR_DEBUG_SCOPE(...) __VA_ARGS__
#endif


CONSTEXPR int
fact(int n){
    CONSTEXPR_DEBUG_SCOPE(
        std::cout << "debug scope" << std::endl;
        std::cout << n << std::endl;
    )
    return n == 1 ? 1 : fact(n-1) * n;
}

int
main(){
//     static_assert(fact(4) == 24, "");
    fact(4);
    return 0;
}

[出力]

debug scope
4
debug scope
3
debug scope
2
debug scope
1

と、いう感じで簡単なマクロを書いてみました。
本当は関数の呼び出し時に constexpr かそうじゃないかを切り替えできればいいんですが、定義側がごちゃごちゃしそうなので、これぐらいが楽かなぁ。

[コンパイラ]

  • g++ (GCC) 4.8.0 20120415 (experimental)
  • clang++ (LLVM) 3.1 20120327(trunk)