Как определить одну специализацию шаблона для фундаментальных типов и другую для пользовательских
Мне нужно чтобы функция бы при передаче ей фундаментальных типов исполняла один код, а при передаче пользовательских типов поведение отличалось. Прочитал про std::is_fundamental но он вызывается уже в коде и у меня функция не скомпилируется если буду делать такие проверки так как в шаблонной функции присутствуют вызовы методов каких нет у простых типов, как это можно определять прямо при инстанциации?
Ответы (1 шт):
Автор решения: KoVadim
→ Ссылка
Если компилятор поддерживает 17 стандарт, тогда просто
#include <iostream>
#include <type_traits>
using namespace std;
template<typename T>
void show(T t)
{
if constexpr(std::is_fundamental<T>::value) {
std::cout << "fund\n";
} else {
std::cout << "non\n";
}
}
int main()
{
show(1);
std::string s;
show(s);
}
Если компилятор постарше (подреврее), то можно где то так (гуглить SFINAE)
template<typename T>
typename std::enable_if<std::is_fundamental<T>::value>::type show(T t)
{
std::cout << "fund\n";
}
template<typename T>
typename std::enable_if<!std::is_fundamental<T>::value>::type show(T t)
{
std::cout << "non\n";
}