Стоит ли использовать шаблоны с большим количеством строгих типов

259
01 ноября 2017, 03:39

Есть функция, реализация которой не отличается при любых типах данных. Но тип данных не может быть абсолютно любым ( всего возможных типов данных которые обработает функция - 9 ).

Вопрос: стоит ли делать шаблон для такой функции, а внутри просто проверять является ли тип данных "правильным", или лучше сделать всё обычной перегрузкой?

Answer 1

Вообще, один из плюсов (не главный, конечно) шаблонов - уменьшение дублирования кода. А так придется писать 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 и компании оптимально, поскольку они успешно обрабатывают все подобные ситуации.

READ ALSO
методы CV_TM_CCOEFF и CV_TM_CCOEFF_NORMED в OpenCV

методы CV_TM_CCOEFF и CV_TM_CCOEFF_NORMED в OpenCV

Хочу реализовать аналогичную функцию matchTemplate, которая есть в openCVДанная функция принимает на вход тип метода, который определяет меру схожести...

283
QTableView обработка выделения строк

QTableView обработка выделения строк

Совсем запутался с обработкой выделения строк в QTableView

314
Наличие или отсутствие точки с запятой в теле функции

Наличие или отсутствие точки с запятой в теле функции

При определении функции с пустым телом, как правильнее написать её код и зависит ли от этого "логика" самой функции? Если разницы нет, то есть...

252
Шаблоны переменных в C++14

Шаблоны переменных в C++14

Изучая новый стандарт C++, натолкнулся на нововведение «шаблоны переменных»

231