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