C++にもstatic ifが欲しいと思い作ってみましたが、かなり苦戦しました。
やっぱり言語ネイティブでサポートして欲しいですね。C++0xの規格の範囲ではどうやっても無理そうで、gccの挙動に依存してます。
STATIC_IF library for C++ · GitHub
利点
static ifがあればコンパイル時プログラミングをよりわかり易く簡潔に記述できます。
定数を使った再帰的な関数等はコンパイル時に展開でき、その際に邪魔になる不要なインスタンス化を避けることができます。
従来はテンプレートの特殊化を使用して関数を分割し重複した関数定義を書く必要がありました。
使い方
関数テンプレート又はメンバ関数テンプレート内で使用する。
STATIC_IFではじめSTATIC_ENDIFで終わる。
#include "static_if.hpp" template <int N> void Repeat() { STATIC_IF(N>0) { std::cout << N << std::endl; Repeat<N-1>(); }STATIC_ELSE{ std::cout << "stop\n"; }STATIC_ENDIF } Repeat<5>();
STATIC_IF, STATIC_ELSEIF, STATIC_ELSEを用意しました。STATIC_ELSEIFは何回でも使えます。
STATIC_IFはネスト可能です。
ラムダ式を使用しているのでスコープ外のローカル変数にもアクセス可能。
おまけの STATIC_BREAKIF を使うと一番内側のSTATICなブロックを抜けられます。
問題点
不要なインスタンス化を避けられている理由は不明でgccの挙動に依存していること。
関数テンプレート又はメンバ関数テンプレート内でしか使用できない。
スコープ内で return, continue, break, goto などが使用できない。
追記
C++14からgeneric lambdaが入ったのでマクロを使えば何とか規格の範囲でstatic_ifが実装できるようになりました。https://github.com/gununu/static_if
C++17から言語機能の if constexpr( ) が利用できるようになります。