#cpp #function_overloading #шаблоны_с++
Есть функция, реализация которой не отличается при любых типах данных. Но тип данных не может быть абсолютно любым ( всего возможных типов данных которые обработает функция - 9 ). Вопрос: стоит ли делать шаблон для такой функции, а внутри просто проверять является ли тип данных "правильным", или лучше сделать всё обычной перегрузкой?
Ответы
Ответ 1
Вообще, один из плюсов (не главный, конечно) шаблонов - уменьшение дублирования кода. А так придется писать 9 почти одинаковых (за исключением типов) функций. Дублирование кода! (Или Вы не ленивый программист?) Используйте std::enable_if_t и отсекайте ненужные типы, для этого этот механизм и был введен в стандарт. Учитывая комментарий про типы, которые преобразуются в std::string, можете попробовать использовать std::is_convertible. Хотя стоит учесть специфику Вашей задачи, возможно, это недостаточное условие. Вот пример использования std::is_convertible с сайта: #include#include struct A { }; struct B : A { }; int main() { std::cout << std::boolalpha; std::cout << "is_convertible:" << std::endl; std::cout << "int => float: " << std::is_convertible ::value << std::endl; std::cout << "int = >const int: " << std::is_convertible ::value << std::endl; std::cout << "A => B: " << std::is_convertible::value << std::endl; std::cout << "B => A: " << std::is_convertible::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 и компании оптимально, поскольку они успешно обрабатывают все подобные ситуации.
Комментариев нет:
Отправить комментарий