Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
1

Template для определенных типов

09.10.2019, 21:58. Показов 4139. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, можно ли сделать template для определенных типов данных? К примеру:
C++
1
2
3
4
5
6
7
template <long>
template <int T>
template <class MyClass>
void func(T t)
{
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2019, 21:58
Ответы с готовыми решениями:

Функция swap перестановки значений двух переменных для данных разных типов. Используйте template
не могу решить ( честно говоря вообще не понимаю его ) ((((( Напишите функцию swap перестановки...

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

Можно ли сделать шаблон функции только для определенных типов?
Например template&lt;typename T&gt; void func(T x){} Где T может быть только int,double и float

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я...

8
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
09.10.2019, 22:47 2
Лучший ответ Сообщение было отмечено k0vpack как решение

Решение

Насколько я понял вам нужно сделать так что бы шаблон принимал только указанные типы?
Вот решение для С++17
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
#include <iostream>
#include <type_traits>
 
template<class T, class... Args>
inline constexpr bool is_one_of = (std::is_same_v<T, Args> || ...);
 
class MyClass;
 
template<typename T>
typename std::enable_if<is_one_of<T, long, int, MyClass>, void>::type
func(T arg)
{
    std::cout << "arg = " << arg << '\n';
}
 
int main()
{
    int n1 = 1;
    long n2 = 2;
    [[maybe_unused]] double n3 = 3;
    func(n1);
    func(n2);
    // func(n3); compile error
}
1
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
10.10.2019, 17:41  [ТС] 3
Undisputed, а если нужно для С++ 11, или даже С++ 99? Можно ли?
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.10.2019, 17:59 4
Лучший ответ Сообщение было отмечено k0vpack как решение

Решение

Цитата Сообщение от k0vpack Посмотреть сообщение
а если нужно для С++ 11
C++
1
2
3
4
5
6
7
8
9
10
template<typename T, typename... Args>
struct is_any : std::false_type {};
 
template<typename T, typename U>
struct is_any<T, U> : std::is_same<T, U> {};
 
template<typename T, typename U, typename... Args>
struct is_any<T, U, Args...>
    : std::integral_constant<bool, std::is_same<T, U>::value || is_any<T, Args...>::value>
{};
Цитата Сообщение от k0vpack Посмотреть сообщение
С++ 99?
Такого стандарта нету. Есть с++98.
Цитата Сообщение от k0vpack Посмотреть сообщение
Можно ли?
Да.

Добавлено через 6 минут
Но лучше без рекурсии:
C++
1
2
3
4
5
6
7
// C++11
template <typename... Args>
struct pack {};
 
template <typename T, typename... Args>
struct is_any : std::is_same<pack<T, Args...>, pack<Args..., T>>
{};
1
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
10.10.2019, 18:01  [ТС] 5
Azazel-San, можно с явным примером?
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.10.2019, 18:43 6
Лучший ответ Сообщение было отмечено k0vpack как решение

Решение

k0vpack, все так же, почти:
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
template<typename T, typename... Args>
struct is_any : std::false_type {};
 
template<typename T, typename U>
struct is_any<T, U> : std::is_same<T, U> {};
 
template<typename T, typename U, typename... Args>
struct is_any<T, U, Args...>
    : std::integral_constant<bool, std::is_same<T, U>::value || is_any<T, Args...>::value>
{};
 
template<typename T> 
typename std::enable_if<
    is_any<T, int, float>::value
, void>::type func(T t) noexcept {
    std::cout << "t = " << t << '\n';
}
 
int main() {
    int i;
    char c;
    func(i);
    // func(c); error
}
Добавлено через 6 минут
Цитата Сообщение от Azazel-San Посмотреть сообщение
Но лучше без рекурсии:
А это чуть другое, погорячился.
Это не is_any, a is_all

Добавлено через 19 минут
Цитата Сообщение от Azazel-San Посмотреть сообщение
is_all
На основе этого можно сделать conjunction
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
#include <type_traits>
#include <iostream>
 
template <bool... Args>
struct pack {};
 
template <typename... Args>
struct conjunction : std::is_same<pack<true, Args::value...>, pack<Args::value..., true>>
{};
 
template<typename T, typename... Args>
typename std::enable_if<conjunction<std::is_same<T, Args>...>::value>::type
func(T, Args...) {
    std::cout << "all types in pack are T\n";
}
 
template<typename T, typename... Args>
typename std::enable_if<!conjunction<std::is_same<T, Args>...>::value>::type
func(T, Args...) {
    std::cout << "not all types in pack are T\n";
}
 
int main() {
    func(1, 2, 3);
    func(1, 2, "hello!");
}
1
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
10.10.2019, 18:49 7
Цитата Сообщение от Azazel-San Посмотреть сообщение
Но лучше без рекурсии:
C++
1
2
3
4
5
6
7
// C++11
template <typename... Args>
struct pack {};
 
template <typename T, typename... Args>
struct is_any : std::is_same<pack<T, Args...>, pack<Args..., T>>
{};
И что же должен определять этот шаблон?
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.10.2019, 18:54 8
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И что же должен определять этот шаблон?
например, это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <type_traits>
#include <iostream>
 
template <typename... Args>
struct pack {};
 
template <typename T, typename... Args>
struct is_all : std::is_same<pack<T, Args...>, pack<Args..., T>>
{};
 
template<typename T, typename... Args>
typename std::enable_if<is_all<T, Args...>::value>::type
func(T, Args...) {
    std::cout << "all types in pack are T\n";
}
 
int main() {
    func(1, 2, 3);
    // func(1, 2, "hello!"); error
}
Еще один пример есть выше.
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
10.10.2019, 19:17 9
k0vpack,
Вот вариант для С++98
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
37
38
39
40
41
42
43
44
#include <iostream>
 
template<typename A, typename B>
struct is_same  
{
    static const bool value = false;
};
 
template<typename A>
struct is_same<A, A> 
{
    static const bool value = true;
};
 
template<bool B, typename T = void>
struct enable_if {};
 
template<typename T>
struct enable_if<true, T> { typedef T type; };
 
class MyClass;
 
template<typename T>
typename enable_if<
    is_same<T, int>::value  || 
    is_same<T, long>::value || 
    is_same<T, MyClass>::value, 
    void
>::type
func(T arg)
{
    std::cout << "arg = " << arg << '\n';
}
 
int main()
{
    int n1 = 1;
    long n2 = 2;
    double n3 = 3;
    (void)n3;
    func(n1);
    func(n2);
    //func(n3); // compile error
}
0
10.10.2019, 19:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2019, 19:17
Помогаю со студенческими работами здесь

Template definition of non-template при использовании частичной спецификации шаблонов
Всем привет! Есть задача написать шаблон класса, принимающего в качестве параметров типа шаблон и...

'MyQueue' : use of class template requires template argument list
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки...

В чем различие template <typename T> от template <class T> ?
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template...

Ошибка компиляции: template-id does not match any template declaration
Здравствуйте. Помогите, пожалуйста: #include &lt;iostream&gt; using namespace std; template...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru