yohhoyの日記

技術的メモをしていきたい日記

式のコンパイル時評価判定

C++20言語機能を利用した、ある式がコンパイル時に評価可能かを判定するメタ関数的なもの。id:yohhoy:20190528 の別解。

本記事の内容はStackOverflowで見つけた質問と回答に基づく。

// C++20以降
template<class Lambda, int = (Lambda{}(), 0)>
constexpr bool is_constexpr(Lambda) { return true; }
constexpr bool is_constexpr(...) { return false; }

template<int N> void do_stuff();
void do_stuff(int N);

template<typename T>
int process(const T&)
{
  // 式 T::number() をコンパイル時に評価可能?
  if constexpr (is_constexpr([]{ T::number(); })) {
    do_stuff< T::number() >();
    return 1;
  } else {
    do_stuff( T::number() );
    return 2;
  }
}

struct X { static constexpr int number() { return 42; } };
struct Y { static int number() { return 42; } };
int main()
{
  assert(process(X{}) == 1);  // OK(C++17: NG)
  assert(process(Y{}) == 2);  // OK
}

関連URL