Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 22.03.2020
Сообщений: 131

Определение типа переменной в шаблоне

21.04.2020, 16:31. Показов 2921. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
найдите пожалуйста ошибки и вообще,можно ли писать так,как я (T = int)


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
// ConsoleApplication9.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
 
#include <iostream>
using namespace std;
template <typename T>
class Array {
public:
    int N;
    Array(int N) {
        this->N = N;
        
        }
    T* mass = new T[N];
    void Case() {
        cin >> mass[N];
            if (T = int) {
                int counter = 0;
                for (i = 0; i < N; i++) {
                    counter += mass[i];
                }
                cout << counter/N;
            }
    }
    
};
int main()
{
    Array <int> a(5);
    a.Case();
}
Добавлено через 7 минут
Если нельзя писать (T = int ) то подскажите ка можно
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.04.2020, 16:31
Ответы с готовыми решениями:

Определение типа переменной
#include &lt;iostream&gt; #include &lt;typeinfo&gt; int main() { int t = 10; std::cout &lt;&lt; typeid(t).name() &lt;&lt; std::endl; if...

Определение типа переменной в функции
Добрый день. Есть простая программка для изучения передачи значений/указателей в функции void prnt(void *pp) { int * p; p =...

Определение по указателю типа переменной в коде
Доброго дня форумчанский народ:) Подскажите можно ли провернуть такую штуку: Есть несколько функций, возвращающих значения разного типа. ...

49
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.04.2020, 11:26
Студворк — интернет-сервис помощи студентам
Поскольку у вас класс и вам нужно ограничить тип, то упростив (без заголовка type_traits и enable_if которые были засвечены, чтобы вы поняли где ковырять) можно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
template<class T> struct is_int_type
{
 
};
template<> struct is_int_type<int>
{
     typedef int int_type   ;
};
 
 
template< class T, typename is_int_type<T>::int_type = true >
class Test1{};
 
int main()
{
Test1<int> test1 ;
//Test1<float> test_f1 ;
return 0;
}
То есть, логика выбора типа вычисляется во время компиляции и задавать её нужно как ветвь для SFINAE. Это не простая часть С++ и придётся поработать (не один месяц), чтобы понять. Вы же не пытаетесь и начала посмотреть, где-то, а хотите чтобы вам выдали всё на блюдечке. Вопрос типа: -"Объясните мне вселенную на пальцах". Но ведь следуя мере упрощение, существует лишь одна комбинация из пальцев и это, вероятно, не то чего вы хотите?
0
1 / 1 / 0
Регистрация: 22.03.2020
Сообщений: 131
24.04.2020, 11:47  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
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
template <class T>
void Array<T>::Case() // функция, которая будет выбрана для всех типов кроме double и int
{
    T counter = 0;
    for (int i = 0; i < N; i++)
    {
        counter += mass[i];
    }
    cout << "double total counter = " << counter;
}
//-------------------------------------------------------------------
template <>
void Array<int>::Case() // функция, которая  будет выбрана для типа int
{
    int counter = 0;
    for (int i = 0; i < N; i++)
    {
        counter += mass[i];
    }
    cout << "int total counter = " << counter;
}
//-------------------------------------------------------------------
template <>
void Array<double>::Case() // функция, которая  будет выбрана для типа double
{
    double counter = 0;
    for (int i = 0; i < N; i++)
    {
        counter += mass[i];
    }
    cout << "double total counter = " << counter;
}





я видимо чего-то не понимаю,вот я вставляю это
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
45
46
47
48
49
50
51
#include <iostream>
using namespace std;
template <typename T>
class Array {
public:
    int N;
    Array(int N) {
        this->N = N;
        T* mass = new T[N];
        cout << "Введите массив";
        for (int i = 0; i < N; i++) {
            cin >> mass[i];
        }
    }
   
    void Case() {
       
        
    }
    template <>
    void Array<int>::Case() // функция, которая  будет выбрана для типа int
    {
        int counter = 0;
        for (int i = 0; i < N; i++)
        {
            counter += mass[i];
        }
        cout << "int total counter = " << counter;
    }
    template <>
    void Array<double>::Case() // функция, которая  будет выбрана для типа double
    {
        double counter = 0;
        for (int i = 0; i < N; i++)
        {
            counter += mass[i];
        }
        cout << "double total counter = " << counter;
    }
    ~Array() {
        delete[] mass;
    }
 
};
 
 
int main()
{
    Array <int> a(5);
    a.Case();
}
я вставил таким образом,но там ошибка в начале каждой функции
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
24.04.2020, 11:52
Цитата Сообщение от IGPIGP Посмотреть сообщение
можно так
первую структуру необязательно вообще определять. то есть:
C++
1
2
3
4
5
template<class T> struct is_int_type;
template<> struct is_int_type<int>
{
     typedef int int_type;
};
достаточно.

Добавлено через 2 минуты
Цитата Сообщение от FaceProgrammist Посмотреть сообщение
я вставил таким образом,но там ошибка в начале каждой функции
потому что надо определять уже вне класса.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
template<class T>
struct Foo
{
    void foo()
    {
        std::cout << "foo common\n";
    }
};
 
template<>
void Foo<int>::foo() { std::cout << "foo int\n"; }
 
int main()
{
    Foo<class A> a;
    a.foo();
    Foo<int> b;
    b.foo();
}
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.04.2020, 11:56
GbaLog-, я согласен. Если идти по пути краткости то можно и сам класс Test1 выполнить в виде общего объявления и единственной специализации на int, но я пытаюсь показать логику с if-ом (времени выполнения), что бы было понятно что выбор во время компиляции тоже как-то ветвится. Да и когда условных типов жменька - уже громоздко и неудобно переписывать кучу специализаций) Легче использовать условные выражения - параметры шаблона, тогда.
0
Модератор
Эксперт С++
 Аватар для zss
13799 / 10990 / 6493
Регистрация: 18.12.2011
Сообщений: 29,291
24.04.2020, 12:03
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
using namespace std;
template <typename T>
class Array {
private:
    T* mass;
    int N;
public: 
    Array(int N):N(N) {
        mass = new T[N];
        for (int i = 0; i < N; i++) {
            mass[i]=0;
        }
    }
    void Input() {
        cout << "Введите массив";
        for (int i = 0; i < N; i++) {
            cin >> mass[i];
        }
    }
    void SetRand() {
        for (int i = 0; i < N; i++) {
            mass[i]=static_cast<T>(rand()%101+1);
        }
    }
    void Case(); // только объявляем
    void Print();// только объявляем
    ~Array() {
        delete[] mass;
    }
 
}; //  конец описания класса
 
// --  шаблоны для ------------- Case() ------------------
template <typename T>
void Array<T>::Case() // функция, которая  будет выбрана для типа int
{
    T counter = 0;
    for (int i = 0; i < N; i++)
    {
        counter += mass[i];
    }
    cout << "any type total counter = " << counter << endl;
}
template <>
void Array<char>::Case() // функция, которая  будет выбрана для типа char
{
    int counter = 0;
    for (int i = 0; i < N; i++)
    {
        counter += mass[i];
    }
    cout << "char type total counter = " << counter << endl;
}
template <>
void Array<int>::Case() // функция, которая  будет выбрана для типа int
{
    int counter = 0;
    for (int i = 0; i < N; i++)
    {
        counter += mass[i];
    }
    cout << "int total counter = " << counter << endl;
}
template <>
void Array<double>::Case() // функция, которая  будет выбрана для типа double
{
    double counter = 0;
    for (int i = 0; i < N; i++)
    {
        counter += mass[i];
    }
    cout << "double total counter = " << counter << endl;
}
//    ----   шаблоны для вывода ------------------------------
template <typename T>
void Array<T>::Print() {
    for (int i = 0; i < N; i++) {
        cout << mass[i]<<' ';
    }
    cout << endl;
}
template <>
void Array<char>::Print() {
    for (int i = 0; i < N; i++) {
        cout <<static_cast<int>(mass[i]) << ' ';
    }
    cout << endl;
}
 
int main()
{
    setlocale(LC_ALL, "Rus");
    Array <int> a(5);
    a.SetRand();
    a.Print();
    a.Case();
    Array <double> b(5);
    b.SetRand();
    b.Print();
    b.Case();
    Array <char> c(5);
    c.SetRand();
    c.Print();
    c.Case();
    Array <short int> d(5);
    d.SetRand();
    d.Print();
    d.Case();   
    return 0;
}
1
1 / 1 / 0
Регистрация: 22.03.2020
Сообщений: 131
24.04.2020, 13:20  [ТС]
ух,как же это сложно,спасибо большое !

Добавлено через 1 минуту
C#
1
[quote="zss;14467487"]Array(int N):N(N)[/quote]
обьясни пожалуйста эту строчку

Добавлено через 1 минуту
C++
1
2
 for (int i = 0; i < N; i++) {
            mass[i]=0;
и эту


и зачем там функция setrand если уже есть функция,куда мы вводим массив
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.04.2020, 13:33
Можно и сложнее, если if(T==N) интересен.
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
using namespace std;
template <typename T>
class Array {
public:
    int N;
      T* mass;
    Array(int N_) {
        this->N = N_;
        mass = new T[N];
                }
 
    ~Array(){delete [] mass;}
 
 
    void subCase ();
};
 
template <typename T>
void Array<T>::subCase()
    {
         for (int i = 0; i < N; i++)
         {
              cout<<"Enter data mass["<<i<<"]: ";
              cin >> mass[i] ;
         }
 
        T counter = 0;
                for (int i = 0; i < N; i++) {
                    counter += mass[i];
                }
                cout << counter/N;
    }
 
template <>
void Array<string>::subCase()
    {
         for (int i = 0; i < N; i++)
         {
              cout<<"Enter string mass["<<i<<"]: ";
             cin >> mass[i] ;
         }
        string counter;
                for (int i = 0; i < N; i++) {
                    counter += mass[i];
                }
                cout << counter ;
                // /N;
    }
 
 
template <>
void Array<double>::subCase()
    {
         for (int i = 0; i < N; i++)
         {
              cout<<"Enter double mass["<<i<<"]: ";
             cin >> mass[i] ;
         }
        double counter = 0;
                for (int i = 0; i < N; i++) {
                    counter += mass[i];
                }
                cout << int(counter/N) ;
 
    }
 
int main()
{
    Array <int> aii(2);
    aii.subCase();
    cout<<endl;
    Array <double> add(2);
    add.subCase();
    cout<<endl;
    Array <string> ass(2);
    ass.subCase();
}
0
1 / 1 / 0
Регистрация: 22.03.2020
Сообщений: 131
24.04.2020, 13:45  [ТС]
И еще зачем вы описывали <template Т> функции case и print ,если вы ниже описали уже для всех типов?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.04.2020, 14:08
Цитата Сообщение от IGPIGP Посмотреть сообщение
Можно и сложнее, если if(T==N) интересен.
zss, простите, я не увидел весь текст вашего поста, когда запостил свой. Опять повтор получился. Ну-да ладно)
0
Модератор
Эксперт С++
 Аватар для zss
13799 / 10990 / 6493
Регистрация: 18.12.2011
Сообщений: 29,291
24.04.2020, 14:58
Цитата Сообщение от FaceProgrammist Посмотреть сообщение
Array(int N):N(N)
N(N) - это список инициализации, т.е. this->N=N;
Цитата Сообщение от FaceProgrammist Посмотреть сообщение
for (int i = 0; i < N; i++) {
mass[i]=0;
В конструкторе все переменные надо инициализировать, здесь массив mass инициализируем нулями.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.04.2020, 14:58

Определение типа переменной - строковый или целочисленный
Добрый вечер! Необходима помощь в проверке числа что это число, и проверки строки что это строка. Помогите плз. нужен только вот этот...

Generic, определение типа переменной во время выполнения программы
Итак имеется две переменной: одна переменная хранит тип значения (точнее числовое значение одного из типов в моем enum'e) Для ясности...

Приведение переменной типа object к переменной производного типа в приложенном коде
Добрый день! Столкнулся с проблемой. Есть обработчик события. Обработчик события общий для двух издателей, но издатели разного типа(Пусть...

Определение типа класса по объявлению переменной данного класса
Можно ли по объявлению переменной некоторого класса определить тип этого класса? Реализация данной задачи необходима с целью...

Указание типа итератора в шаблоне
Расскажите про этот момент. #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; template &lt;typename T, typename CONT =...


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

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru