昨日書いたコードを C++11 で記述してみた
昨日書いたコードは C++14 の仕様だったんですが、比較するために C++11 版のコードも書いてみました。
[ソース]
constexpr int abs(int x){ return x < 0 ? -x : x; } template<int Size> constexpr int max_impl(int const (&array)[Size], int result, int index){ return index < Size ? max_impl(array, array[index] > result ? array[index] : result, index + 1) : result; } template<int Size> constexpr int max(int const (&array)[Size]){ return max_impl(array, array[0], 1); } int main(){ static_assert(abs( 4) == 4, ""); static_assert(abs(-4) == 4, ""); constexpr int v[] = {5, 7, 1, 9, 6, 2, 8, 10, 4, 3}; constexpr int result = max(v); static_assert(result == 10, ""); return 0; }
C++11 の constexpr 関数でループを行いたい場合は再帰呼び出しを行います。基本ですね。
なお、訓練された constexprer(中3女子)は for 文よりも再帰呼び出しの方が読みやすいらしい(大嘘。