ilyazh
@ilyazh
Инженер-программист

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

Здравствуйте! Подскажите как реализовать с помощью шаблонов. На данный момент имеется две функции, которые выполняют практически одинаковую работу. Кроме того, функции отличаются типом входных данных: одна принимает только целые значения, а другая только double. Казалось бы просто объединить их в одну с использованием шаблона, но есть нюанс. Дело в том, что в зависимости от типа данных надо произвести разные действия над данными. Данные поступают от железки и передаются в целочисленном виде, а программа знает коэффициент преобразования (1, 0.1, 0.01 и т.д.). Однако, некоторые элементы управления в программе позволяют задавать параметры в формате double. Соответственно у меня есть две функции, которые в зависимости от типа данных, либо применяют умножение на коэффициент, либо нет. Также почему нельзя напрямую применить шаблон - т.к. входные параметры устанавливаются сразу на 2 элемента управления - один принимает только целые числа, а другой принимает double. Вот и приходится домножать где-надо, а где надо делить. Например слайдер принимает только целые и его значения от 0 до 100, а spinbox устанавливаются значения с коэффициентом 0,1, т.е. в диапазоне от 0 до 10.

Подскажите целесообразно ли вообще в данной ситуации использование шаблонов? и если да, то как описать это?
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Можно использовать std::variant (https://en.cppreference.com/w/cpp/utility/variant ), если новые плюсы не доступны, то tagged union (https://en.wikipedia.org/wiki/Tagged_union там есть пример на плюсах).
Можно использовать и шаблоны. Если доступны новые плюсы, то посмотрите в сторону if constexpr (https://en.cppreference.com/w/cpp/language/if там ближе к низу примеры). Если новые плюсы не доступны, то enable_if (https://en.cppreference.com/w/cpp/types/enable_if ) + std::is_same (https://en.cppreference.com/w/cpp/types/is_same ) или std::is_integer/std::is_floating_point (https://en.cppreference.com/w/cpp/types/is_integer / https://en.cppreference.com/w/cpp/types/is_floatin... ).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы