Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Encephalopathy
69 / 69 / 56
Регистрация: 04.06.2016
Сообщений: 235
Завершенные тесты: 2
#1

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

20.07.2017, 00:39. Просмотров 322. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

6
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4402 / 2377 / 657
Регистрация: 18.10.2014
Сообщений: 4,018
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 / 56
Регистрация: 04.06.2016
Сообщений: 235
Завершенные тесты: 2
20.07.2017, 03:48  [ТС] #3
TheCalligrapher, Спасибо,меня интересовал именно первый случай.А смысл второго как я понимаю заключается только в том что нужно только одно объявление функции вместо трех?
0
igdev
74 / 63 / 27
Регистрация: 22.04.2016
Сообщений: 354
Завершенные тесты: 2
20.07.2017, 10:45 #4
Можно сделать, чтобы был какой-то тип по умолчанию:
C++
1
2
template <typename T = int> // По умолчанию тип int
void func(T);
Добавлено через 1 минуту
Хотя, это больше подходит к шаблонным классам. Если не указываем какой-то тип, то по умолчанию он будет int.
0
zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
20.07.2017, 16:04 #5
TheCalligrapher, с constexpr if в этом уже нет смысла
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4402 / 2377 / 657
Регистрация: 18.10.2014
Сообщений: 4,018
20.07.2017, 20:52 #6
Цитата Сообщение от zarko97 Посмотреть сообщение
с constexpr if в этом уже нет смысла
Формально - может быть и так. Фактически же тут на сцену выходят те же самые размышления, которые возникают и при написании обычного run-time ветвления. "Написать ли мне этажерку if-ов? Или завести отдельные функции? Или даже завести виртуальный метод?"

Поэтому "нет смысла" - это слишком смело сказано. Нет, как раз таки, constexpr if скорее уместен в ситуациях, когда надо выполнить незначительную подправку поведения, т.е. для ситуаций, когда особенность поведения настолько мелкая, что городить ради нее отдельные функции не хочется.
0
avgoor
1008 / 602 / 157
Регистрация: 05.12.2015
Сообщений: 1,686
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
21.07.2017, 01:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2017, 01:36

Можно ли сделать шаблон?
есть две функции A(){} и B(){}, использующие в себе третью C(){}. Эта третья...

Как сделать шаблон функции другом шаблона класса?
С обычной функцией понятно: template&lt;class T&gt; class A { friend void...

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


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

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

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