昨日書いたコードを 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 文よりも再帰呼び出しの方が読みやすいらしい(大嘘。