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.- Альтернативные шаблоны: Создание альтернативных версий шаблонов или функций, которые выбираются в зависимости от того, проходит ли подстановка типов в основной шаблон.