SFINAE
SFINAEは元々、無関係なテンプレート宣言が(例えばヘッダーファイルのインクルードなどによって)存在する時に、不正なプログラムが作成されないようにするために導入された。しかし、その後、この挙動はコンパイル時のイントロスペクションに使うことができる、特に、テンプレートの実体化の際に、そのテンプレート引数が必要な特性を持っていることを検知することができることが発見された。
例えば、次の例では、必要なtypedefが存在するかどうかを調べることができる。
もし、型Tに入れ子型foobarが定義されていれば、最初の関数testの実体化が成功し、ヌルポインタ定数を渡すことができる(ので、返り値の型はyes型である)。 一方、もし実体化に失敗すれば、有効な関数は2番目のtestだけであり、返り値の型はno型になる。
なお、この2番目の関数引数が...になっているのは、任意の引数を受け付けるためだけではなく、型変換の優先度が低いためである。これにより、2番目の関数より最初の関数が優先的に呼ばれることになり、型推論の曖昧さを回避することができている。
C++11であれば、上記のコードは以下のように簡単にすることができる。
C++17ではこの技法が標準化され、以下のようにさらに簡潔になった。
Boostライブラリでは、boost::enable_ifなどをSFINAEを使って実装している。