Как определить одну специализацию шаблона для фундаментальных типов и другую для пользовательских

Мне нужно чтобы функция бы при передаче ей фундаментальных типов исполняла один код, а при передаче пользовательских типов поведение отличалось. Прочитал про 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";
}
→ Ссылка