Перегрузка функции с использованием шаблона - PullRequest
0 голосов
/ 16 октября 2018

Вот два объявления перегрузки функции:

void fun(char& arg);
void fun(int&  arg);
void fun(long& arg);

Определения выполняют одну и ту же работу:

void fun(char& arg) { ++arg; }
void fun(int&  arg) { ++arg; }
void fun(long& arg) { ++arg; }

Как один раз объявить и определить функцию с помощью шаблона,который принимает только аргументы int, char и long для аргумента?Ошибка должна появиться как можно скорее (до выполнения), если функция используется неправильно (например, передается переменная типа double).

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете просто static_assert в теле функции с кучей std::is_same

template<typename T>
void fun(T& arg) 
{ 
    static_assert(
        std::is_same_v<T, char> || 
        std::is_same_v<T, int> || 
        std::is_same_v<T, long>, 
        "bad call"); 
    ++arg; 
}
0 голосов
/ 16 октября 2018

Вы можете подать SFINAE с std::enable_if и std::is_same.

template <typename T>
std::enable_if_t<std::is_same_v<T, int> || 
                 std::is_same_v<T, char> || 
                 std::is_same_v<T, long>> 
fun(T& arg) { ++arg; }

Для других типов вы получитеa нет соответствующей функции для вызова ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...