enable_if

enable_ifによりある条件のときだけtemplateを有効にすることができる。逆に言うとtemplateにしたくない条件を無効化することができる。

std::enable_if_t<std::is_convertible_v<T, int>>std::enable_if<std::is_convertible<T, int>::value>::type>と同じことなのでこれについて考える。

全体としての意味はTintに変換できるときだけテンプレートを有効にするということ。

is_convertible<T, int>Tintに変換できるかを判定し、その結果はvalueに格納される。

enable_if<A>Atrueかどうかを判定し、trueならばtypeに型voidを格納する。falseならエラーになる。

よって全体としてTintに変換できない場合はエラーになり、templateのインスタンス化は行われない(コンパイルエラーにはならない(SFINAE))。

この例ではどういうときにこれを使うのかの応用例は示せていないが、特定の型のときだけテンプレートを有効にしたい場合に使う。

typename = としているのはtypename A = などと同じでデフォルトのテンプレート引数の指定、これはテンプレートのインスタンス化をするかどうかだけのために使われるので、コード中では使われないのでこういう記述になっている。