SFINAE (Substitution Failure Is Not An Error) — это техника, используемая в шаблонном программировании C++, при которой неудачная подстановка типов не приводит к ошибке компиляции, а вместо этого вызывает исключение данного шаблона из рассмотрения и выбор другого подходящего шаблона или перегрузки функции.

Пример: Выбор функции с помощью SFINAE

#include <iostream>
#include <type_traits>
 
// Шаблон функции, который сработает только для типов с поддержкой operator<<
template <typename T>
auto print(T t) -> decltype(std::cout << t, void()) {
    std::cout << "Printable: " << t << std::endl;
}
 
// Перегрузка для других типов
void print(...) {
    std::cout << "Not printable" << std::endl;
}
 
int main() {
    print(42);         // Printable: 42
    print("Hello");    // Printable: Hello
    print(std::vector<int>{1, 2, 3}); // Not printable
}

Ключевые техники

  • std::void_t: Используется для проверки существования типов или выражений. Это полезный вспомогательный тип для SFINAE.
  • Альтернативные шаблоны: Создание альтернативных версий шаблонов или функций, которые выбираются в зависимости от того, проходит ли подстановка типов в основной шаблон.