Compile-time магия прошла долгий путь от криптографического SFINAE к читаемым concepts.
Эра 1: Классический SFINAE (C++98)
template<typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
increment(T value) {
return value + 1;
}
// Что происходит? Кто знает...
Эра 2: Type traits (C++11/14)
template<typename T>
std::enable_if_t<std::is_integral_v<T>, T>
increment(T value) {
return value + 1;
}
// Чуть лучше с _t и _v суффиксами
Эра 3: if constexpr (C++17)
template<typename T>
T process(T value) {
if constexpr (std::is_integral_v<T>) {
return value + 1;
} else if constexpr (std::is_floating_point_v<T>) {
return value * 1.1;
} else {
return value;
}
}
// Читается как обычный код!
Эра 4: Concepts (C++20)
template<std::integral T>
T increment(T value) {
return value + 1;
}
// Или
auto increment(std::integral auto value) {
return value + 1;
}
// Красота и понятность!
😏 А какой подход вам больше нравится? Напиши в комментариях!
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность