Есть функция, реализация которой не отличается при любых типах данных. Но тип данных не может быть абсолютно любым ( всего возможных типов данных которые обработает функция - 9 ).
Вопрос: стоит ли делать шаблон для такой функции, а внутри просто проверять является ли тип данных "правильным", или лучше сделать всё обычной перегрузкой?
Вообще, один из плюсов (не главный, конечно) шаблонов - уменьшение дублирования кода. А так придется писать 9 почти одинаковых (за исключением типов) функций. Дублирование кода! (Или Вы не ленивый программист?) Используйте std::enable_if_t
и отсекайте ненужные типы, для этого этот механизм и был введен в стандарт. Учитывая комментарий про типы, которые преобразуются в std::string
, можете попробовать использовать std::is_convertible
. Хотя стоит учесть специфику Вашей задачи, возможно, это недостаточное условие. Вот пример использования std::is_convertible
с сайта:
#include <iostream>
#include <type_traits>
struct A { };
struct B : A { };
int main()
{
std::cout << std::boolalpha;
std::cout << "is_convertible:" << std::endl;
std::cout << "int => float: " << std::is_convertible<int,float>::value << std::endl;
std::cout << "int = >const int: " << std::is_convertible<int,const int>::value << std::endl;
std::cout << "A => B: " << std::is_convertible<A,B>::value << std::endl;
std::cout << "B => A: " << std::is_convertible<B,A>::value << std::endl;
return 0;
}
Про идиому SFINAE можно почитать тут. Варианты использования std::enable_if
есть тут.
Если проверка типа при помощи std::is_convertible
не подходит для данной задачи, то можно сделать проверки типа на основе std::is_integral
, std::is_floating_point
и прочих подобных структур. Прочитать про них можно, например, здесь. Полагаю, в задаче может быть обработано более 9 типов, учитывая всякие квалификаторы, типы int
с размером, разные типы char
и т.д. В таком случае, использование std::is_integral
и компании оптимально, поскольку они успешно обрабатывают все подобные ситуации.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Хочу реализовать аналогичную функцию matchTemplate, которая есть в openCVДанная функция принимает на вход тип метода, который определяет меру схожести...
При определении функции с пустым телом, как правильнее написать её код и зависит ли от этого "логика" самой функции? Если разницы нет, то есть...
Изучая новый стандарт C++, натолкнулся на нововведение «шаблоны переменных»