SFINAE/enable_if
SFINAE расшифровывается как Substitution Failure Is Not An Error. Это относится к ситуации в C++, когда недействительная замена параметров шаблона (в том числе, когда эти параметры выведены неявно в результате неквалифицированного вызова) сама по себе не является ошибкой.
В отсутствие поддержки концепций SFINAE может использоваться для отключения перегрузок шаблонов функций, которые в противном случае представляли бы слишком общую подпись. Формально это поддерживается Boost enable_if library.
Например, Boost QVM определяет перегрузку оператора*, которая работает с любыми типами матриц и векторов, определенными пользователем. Наивным подходом было бы объявить эту перегрузку следующим:
template <class Matrix,class Vector>
Vector operator*( Matrix const & m, Vector const & v );
Даже если определение функции может содержать код, который компилируется только для типов Matrix и Vector, поскольку сама декларация функции действительна, она будет участвовать в перегрузках при умножении объектов любых двух типов вообще. Это обычно делает разрешения перегрузки неоднозначными, и компилятор (правильно) выдает ошибку.
Используя enable_if, Boost QVM объявляет такие перегрузки таким образом, что они сохраняют свою общую подпись, но участвуют только (в разрешениях перегрузки), если принятые параметры имеют смысл в зависимости от семантики определяемой операции:
template <class A,class B>
typename enable_if_c<
is_mat<A>::value && is_vec<B>::value && mat_traits<A>::cols==vec_traits<B>::dim, //Condition
B>::type //Return type
operator*( A const & a, B const & b );
Для краткости объявления функций в этой документации определяют условие, которое контролирует, включены ли они или нет, не указывая точно, какая конструкция enable_if используется для достижения этого эффекта.