C++1y static if

C++1yでは、D言語にもあるstatic ifが提案されています。
宣言と文が現れるあらゆるところで使えるようにしよう、ということで考えられいて、ユースケースもいろいろ考えられています。


まず、コンパイル時条件によって処理を呼び分ける基本的な用途。
以下の、コンパイル時条件で分岐するような処理は、これまで関数オーバーロードでやっていました。

static if (sizeof(size_t) == 8) {
    // 64ビット版のコンパイルではこっち
    void fun();
}
else {
    void gun();
}

次に、クラスの定数/型定義。
以下の階乗のような例は、これまで特殊化でやっていました。

template <unsigned long n>
struct factorial {
    static if (n <= 1) {
        enum : unsigned long { value = 1 };
    }
    else {
        enum : unsigned long {
            value = factorial<n - 1>::value * n
        };
    }
};

これまでSFINAEでやっていた、テンプレート制約や、コンパイル時条件によるオーバーロードと呼ばれるもの:

template <class It, class T>
void uninitialized_fill(It b, It e, const T& x)
    if (std::is_convertible<
            T,
            std::iterator_traits<It>::value_type
            >::value)
{
    // 条件を満たす場合にオーバーロードされる
}
template <class T>
class CheckedNum
if (std::is_numeric<T>::value) // 整数型のみ許可する
{
    ...
};


N3322 A Preliminary Proposal for a Static if
N3329 Proposal: static if declaration