、SFINAEは、ネストされたタイプtype
を取得するためには、戻り値の型または両方のケースでは、デフォルトのパラメータ
// SFINAE on return type for functions with fixed arguments (e.g. operator overloading)
template<class T>
typename std::enable_if< std::is_integral<T>::value, void>::type
my_function(T const&);
// SFINAE on dummy argument with default parameter for functions with no return type (e.g. constructors)
template<class T>
void my_function(T const&, std::enable_if< std::is_integral<T>::value, void>::type* = nullptr);
と、関数の仮引数のいずれかでT
のsubstutionに行われていますSFINAEの本質。 std::enable_if
とは対照的に、assert
テンプレートのには、SFINAEの代替部分で使用できる入れ子タイプがありません。
詳細については、Jonathan Wakelyの優れたACCU 2013 presentationを参照してください。また、C++ 11の表現SFINAEも参照してください。 (コメントで@BartekBanachewiczで指摘したように)である関数テンプレートのデフォルト引数にSFINAEを使用することも可能になりました
// use C++11 default function arguments, no clutter in function's signature!
template<class T, class dummy = typename std::enable_if< std::is_integral<T>::value, void>::type>
void my_function(T const&);
が
どちらコードなかでもSFINAEです。 – jrok
SFINAEはコンパイル時エラーを引き起こさない(置換が失敗した場合)、静的なアサーション_is_の全目的がコンパイル時エラーを引き起こす(一部の条件が真ではない)のに対して、 –
@ウィキペディアは 'enable_if'がSFINAEだと言っています、それは間違っていますか? – nijansen