マクロ関数の引数内でカンマを使用する

下記のようにマクロ関数内でテンプレート等を書く場合にカンマを使用すると、式が評価される前に引数として扱われるのでエラーになります。

#define STATIC_ASSERT(expr) static_assert(expr, #expr)

// error: too many arguments provided to function-like macro invocation
STATIC_ASSERT(std::is_same<int, int>::value);
// ...( (std::is_same<int), (int>::value) ) のように評価される

// 回避するためには式を括弧でくくる
STATIC_ASSERT( (std::is_same<int, int>::value) );

これ、エラー気づかないでたまにハマることが多くて、括弧を記述するのも地味に手間だったんですが、 可変長マクロで回避出来そうなのでやってみました。

[ソース]

#include <type_traits>

#define STATIC_ASSERT_IMPL(expr) static_assert(expr, #expr)
#define STATIC_ASSERT(...) STATIC_ASSERT_IMPL((__VA_ARGS__))

// ok
STATIC_ASSERT(std::is_same<int, int>::value);

簡単なマクロ関数だとこれでも問題ないかな?
引数が複数の場合には使えませんが…。

[コンパイラ]

  • g++ (GCC) 4.7.0 20111203 (experimental)
  • clang++ (llvm) 3.1 20120216(trunk)