Nano Hash - криптовалюты, майнинг, программирование

Перегрузка функции с использованием шаблона

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

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).



Ответы:


1

Можно просто 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; 
}
16.10.2018
  • Я думаю, что мне нравится это решение больше всего, так как вы можете предоставить красивое, читаемое сообщение об ошибке вместо очень подробного сообщения об ошибке компилятора. 16.10.2018
  • Мне нравится, как я дал то же решение в тот же самый момент, но получил -4 и никаких голосов или правок из-за тангенциального, по общему признанию, неправильного утверждения: P Ну, ладно, думаю, именно так рушится печенье. 16.10.2018

  • 2

    Вы можете применить 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; }
    

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

    16.10.2018
  • Это имеет то преимущество, что вы можете предоставлять различные перегрузки fun для типов, отличных от char&, int& и long& в другом месте. 16.10.2018
  • С возвращаемым значением: 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>>* = nullptr> T fun(const T& arg) { return arg+1; } 15.05.2020
  • @Энди Вы также можете 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>, T> fun.... 15.05.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..