Я пытаюсь определить функцию, используя шаблоны, и я хочу, чтобы typename было либо int, либо anEnum (конкретное перечисление, которое я определил). Я пробовал следующее, но мне не удалось:
template <int | anEnum T> // or <int T, anEnum T> or <int, anEnum T>
bool isFunction(const T &aVariable){}
Я пытаюсь использовать шаблоны вместо определения двух перегруженных функций. Я бы предпочел, чтобы эта функция вызывалась следующим образом, без необходимости учитывать тип программиста.
isFunction(aVariable) // and not isFunction<int> (aVariable) nor isFunction<anEnum> (aVariable)
По сути, я хочу, чтобы эта функция была шаблонной для типов int и aNum. Я искал это, но не смог найти ответ. Что я могу пропустить? Спасибо,
c++
templates
overloading
Б.Г.
источник
источник
false
для других типов или хотите не создавать экземпляр функции для других типов.Ответы:
В дополнение к ответу, не относящемуся к C ++ 20, если вы случайно можете использовать C ++ 20 и его
concepts
возможности, я бы предложил вам следующую реализацию:демонстрация
ОБНОВИТЬ
Согласно комментарию @RichardSmith , вот более масштабируемый и многократно используемый подход:
источник
template<typename T, typename ...U> concept one_of = (std::is_same_v<T, U> || ...);
template<one_of<int, MyEnum> T> bool isFunction(T const& aVariable) {
Есть несколько способов сделать это. Все связаны с использованием
type_traits
заголовка. Например, вы можете статически утверждать для рассматриваемых типов в теле функции.Или, если вам нужно рассмотреть эту функцию среди других перегрузок, можно использовать метод SFINAE.
Это удалит функцию из набора перегрузки перед вызовом, если типы не совпадают. Но если вам не нужно это поведение, статическое утверждение допускает более понятное сообщение об ошибке для программиста.
источник
Как насчет этого решения? Код с функцией будет скомпилирован, если тип T удовлетворяет вашим требованиям. В противном случае статическое утверждение не выполнено.
источник
isFunction(std::string_view)
). Подпись все равно будет действительным совпадением, но создание экземпляра вызывает ошибку.Я улучшил https://stackoverflow.com/a/60271100/12894563 ответ. «Если constexpr» может помочь в этой ситуации:
isFunction (1L) потерпит неудачу, потому что нет перегруженной функции или ветки 'if constexpr'.
ОБНОВЛЕНИЕ: исправлено пропущено
https://godbolt.org/z/eh4pVn
источник
static_assert(false, ...)
плохо сформированный NDR, даже не будучи использованным. Если вам повезет, ваш компилятор сразу же скажет вам, как это делает Кланг