Использование С++ 11 enable_if
Я хочу определить несколько специализированных реализаций для функции (в зависимости от типа параметра, скажем), а также реализации по умолчанию. Каков правильный способ его определения?
Следующий пример не работает должным образом, так как вызывается "общая" реализация, независимо от типа T
.
#include <iostream>
template<typename T, typename Enable = void>
void dummy(T t)
{
std::cout << "Generic: " << t << std::endl;
}
template<typename T, typename std::enable_if<std::is_integral<T>::value>::type>
void dummy(T t)
{
std::cout << "Integral: " << t << std::endl;
}
template<typename T, typename std::enable_if<std::is_floating_point<T>::value>::type>
void dummy(T t)
{
std::cout << "Floating point: " << t << std::endl;
}
int main() {
dummy(5); // Print "Generic: 5"
dummy(5.); // Print "Generic: 5"
}
Одно из решений моего минимального примера состоит в явном объявлении "общей" реализации как не для интегральных, так и для типов с плавающей запятой, используя
std::enable_if<!std::is_integral<T>::value && !std::is_floating_point<T>::value>::type
Это именно то, чего я хочу избежать, так как в моих реальных случаях существует множество специализированных реализаций, и я бы хотел избежать очень длительного (ошибки, подверженного!) условия для реализации по умолчанию.