Можно ли работать с отдельными типами в шаблоне?

Собственно, есть две функции и шаблон для ввода-вывода данных. Можно ли работать с отдельными типами данных в шаблоне? Например, чтобы проверить, что числа лежат в определенном диапазоне. Возможно, что у меня в коде что-то неправильно, т.к. изучаю С++ недавно и многого не знаю. И вообще, можно ли шаблон по-другому написать?

#include <iostream>;
#include <clocale>;
using namespace std;
#include <cstring>;
#include <cmath>;

void func(char* s1, char* s2);
unsigned char func(unsigned char x, unsigned char y);

template <typename T>
auto input()
{
    T x1;
    T x2;
    cout << "Введите данные: " << endl;
    cin >> x1 >> x2;
    return func(x1, x2);
}

int main()
{
    setlocale(LC_ALL, "Russian");
    input<char[256]>();

    auto y = input<int>();
    cout << "y: " << int(y) << endl;

    return 0;
}
//Функция определяет входит ли подстрока в строку
void func(char* s1, char* s2) {
    if (strlen(s1) < strlen(s2)) {
        swap(s1, s2);
    }

    if (strstr(s1, s2) != 0) {
        cout << "Подстрока входит" << endl;
    }
    else {
        cout << "Подстрока не входит" << endl;
    }
}
//Функция для поиска модуля вектора
unsigned char func(unsigned char x, unsigned char y) {
    return sqrt(x * x + y * y);
}


Ответы (1 шт):

Автор решения: KoVadim

Вам нужен либо SFINAE и специализация шаблона под конкретный тип/типы, либо, если у Вас с++17 - if constexpr

То есть, можно написать так

template <typename T>
auto input()
{
    T x1;
    T x2;
    if constexpr (is_floating_point_v<T>) {
      std::cout << "хотят fload или double";
    }
    cout << "Введите данные: " << endl;
    cin >> x1 >> x2;
    return func(x1, x2);
}
→ Ссылка