Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Encephalopathy
69 / 69 / 29
Регистрация: 04.06.2016
Сообщений: 235
Завершенные тесты: 2
#1

Можно ли сделать шаблон функции только для определенных типов? - C++

20.07.2017, 00:39. Просмотров 279. Ответов 6
Метки нет (Все метки)

Например
C++
1
2
template<typename T>
void func(T x){}
Где T может быть только int,double и float
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2017, 00:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Можно ли сделать шаблон функции только для определенных типов? (C++):

Как сделать один шаблон для разных типов - C++
Предположим я реализую некоторый шаблонный класс, в котором, ну ради примера к объектам шаблонного типа (тип, используемый в заголовке...

Шаблонные функции только для определённых типов! - C++
Как сделать чтобы для шаблонной функции генерировались только экземпляры для нескольких заданных типов, а остальные не генерировались? ...

Как сделать шаблон функции для определения максимального расстояния между элементами - C++
Написать программу которая использует шаблон функции для определения максимального расстояния между элементами в наборе в 5 элементов....

Шаблон для пользовательских типов данных - C++
В общем имееются две функции. Одна принимает тип данных string другая char. Функции выполняют одну и ту же задачу. Вопрос как сделать...

шаблон для различных типов одномерных массивов - C++
Общая постановка. Даны: число N и последовательность a1, a2, … aN. Создать шаблон класса, порождающий динамические одномерные массивы с...

Указатель на привязанную функцию можно использовать только для вызова функции - C++
int ident=mflats.at(1).GetIdent; Объясните пожалуйста, почему нельзя использовать такую форму? (функции Int, возвращает нужное мне...

6
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4276 / 2295 / 567
Регистрация: 18.10.2014
Сообщений: 3,910
20.07.2017, 03:42 #2
Несколько громоздко, но все же

C++
1
2
3
4
5
6
7
template <typename T>
typename std::enable_if<std::is_same<T, int>::value || 
                        std::is_same<T, double>::value || 
                        std::is_same<T, float>::value>::type 
func(T x) 
{ 
}
Это если реализация шаблонной функции идентична для всех трех типов. Если же реализации различаются (т.е. их все равно придется выписывать отдельно), то можно просто поступить так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename T> void func(T x) = delete;
 
template<> void func(int x) // Специализация для int
{
}
 
template<> void func(double x) // Специализация для double
{
}
 
template<> void func(float x) // Специализация для double
{
}
5
Encephalopathy
69 / 69 / 29
Регистрация: 04.06.2016
Сообщений: 235
Завершенные тесты: 2
20.07.2017, 03:48  [ТС] #3
TheCalligrapher, Спасибо,меня интересовал именно первый случай.А смысл второго как я понимаю заключается только в том что нужно только одно объявление функции вместо трех?
0
igdev
74 / 63 / 14
Регистрация: 22.04.2016
Сообщений: 344
Завершенные тесты: 2
20.07.2017, 10:45 #4
Можно сделать, чтобы был какой-то тип по умолчанию:
C++
1
2
template <typename T = int> // По умолчанию тип int
void func(T);
Добавлено через 1 минуту
Хотя, это больше подходит к шаблонным классам. Если не указываем какой-то тип, то по умолчанию он будет int.
0
zarko97
279 / 39 / 0
Регистрация: 11.10.2015
Сообщений: 405
20.07.2017, 16:04 #5
TheCalligrapher, с constexpr if в этом уже нет смысла
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4276 / 2295 / 567
Регистрация: 18.10.2014
Сообщений: 3,910
20.07.2017, 20:52 #6
Цитата Сообщение от zarko97 Посмотреть сообщение
с constexpr if в этом уже нет смысла
Формально - может быть и так. Фактически же тут на сцену выходят те же самые размышления, которые возникают и при написании обычного run-time ветвления. "Написать ли мне этажерку if-ов? Или завести отдельные функции? Или даже завести виртуальный метод?"

Поэтому "нет смысла" - это слишком смело сказано. Нет, как раз таки, constexpr if скорее уместен в ситуациях, когда надо выполнить незначительную подправку поведения, т.е. для ситуаций, когда особенность поведения настолько мелкая, что городить ради нее отдельные функции не хочется.
0
avgoor
965 / 599 / 130
Регистрация: 05.12.2015
Сообщений: 1,682
21.07.2017, 01:36 #7
...

Добавлено через 3 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Несколько громоздко, но все же
Я, когда-то давно, использовал нечто такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <type_traits>
#include <iostream>
 
template <class, class...>
struct is_one_of;
 
template <class T, class U, class... Args>
struct is_one_of <T, U, Args...> : public std::conditional_t<std::is_same<T, U>::value, std::true_type, is_one_of<T, Args...>>::type {};
 
template <class T>
struct is_one_of<T> : public std::false_type {};
 
 
 
 
template<class T>
std::enable_if_t<is_one_of<T, int, unsigned>::value> foo(T)
{
    std::cout << "int or unsigned" << std::endl;
}
 
template<class T>
std::enable_if_t<is_one_of<T, float, double>::value> foo(T)
{
    std::cout << "float or double" << std::endl;
}
 
 
int main()
{
    foo(1);
    foo(2u);
    foo(3.0);
    //foo('a'); // error
    return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2017, 01:36
Привет! Вот еще темы с ответами:

можно ли сделать шаблон? - C++
есть две функции A(){} и B(){}, использующие в себе третью C(){}. Эта третья содержит в себе if (a&lt;b) {...} вот в A нужно иметь a&lt;b, а...

Как сделать шаблон функции другом шаблона класса? - C++
С обычной функцией понятно: template&lt;class T&gt; class A { friend void f(); } А вот если функция f шаблонная, то указать ее...

Аналог strcpy, memmove но только для бинарних файловых типов fstream - C++
Есть ли функциям аналог strcpy, memmove но только для бинарных файловых типов fstream. Например, надо вставить данные в определенную...

без знаковый double. Если ли чтоб можно было в шаблон пихать или самому сделать придется ? - C++
сабжж


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru