とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

実行時とコンパイル時とで処理を分けたい

#include<iostream>

constexpr unsigned fact_compile_time(unsigned n)
{
 return n < 2 ? 1
  : fact_compile_time(n - 1) * n;
}

unsigned fact_run_time(unsigned n)
{
 unsigned ret = 1;
 for(; n > 1; --n)
  ret *= n;
 return ret;
}

constexpr unsigned fact(unsigned n, bool ctfe = true)
{
 return ctfe ? fact_compile_time(n)
  : fact_run_time(n);
}

int main()
{
 constexpr auto ctfe_fact10 = fact(10);
 std::cout << ctfe_fact10 << '\n';

 std::cout << fact(10, false) << '\n';
}

実行結果

3628800
3628800

D言語の __ctfe が C++ にも欲しいですね…。