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

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

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

Author24 — интернет-сервис помощи студентам
найдите пожалуйста ошибки и вообще,можно ли писать так,как я (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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2020, 16:31
Ответы с готовыми решениями:

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

Определение типа переменной в функции
Добрый день. Есть простая программка для изучения передачи значений/указателей в функции void...

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

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

49
Just Do It!
4027 / 2421 / 640
Регистрация: 23.09.2014
Сообщений: 7,795
Записей в блоге: 2
21.04.2020, 17:00 2
Цитата Сообщение от FaceProgrammist Посмотреть сообщение
Если нельзя писать (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
32
33
34
35
36
37
38
39
40
41
#include <iostream>
using namespace std;
 
template <typename T>
class Array
{   public:
        int N;
        int* mass;
        Array(int n)
        {   N = n;
            mass = new int[n];
            for(int i = 0; i < n; i++)
            {   cin >> mass[i];
            }
        }
       ~Array()
        {   delete[] mass;
        }
        
        void Case()
        {
            int counter = 0;
            for (int i = 0; i < N; i++)
            {   counter += mass[i];
            }   cout << "counter = " << counter/N;
        }
};
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{   Array<int> a(5);  // Успех!
    a.Case();
    
    ///---------------------------------------|
    /// Типы отличные от int запрещены!       |
    ///---------------------------------------:
    //Array<char>   a(5); // Ошибка компиляци (
    //Array<double> a(5); // Ошибка компиляци (
}
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.04.2020, 17:25 3
Цитата Сообщение от XLAT Посмотреть сообщение
Типы отличные от int запрещены!
А нафига тогда шаблон?
0
Just Do It!
4027 / 2421 / 640
Регистрация: 23.09.2014
Сообщений: 7,795
Записей в блоге: 2
21.04.2020, 17:29 4
Цитата Сообщение от zayats80888 Посмотреть сообщение
А нафига
сделать автору приятное,
чтобы он мог написать:
Array<int> a(5);
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.04.2020, 17:46 5
Цитата Сообщение от XLAT Посмотреть сообщение
сделать автору приятное,
чтобы он мог написать:
Array<int> a(5);
А что ему мешает вместо этого (в 33 строке) написать Array<double> a(5);?
0
Just Do It!
4027 / 2421 / 640
Регистрация: 23.09.2014
Сообщений: 7,795
Записей в блоге: 2
21.04.2020, 18:05 6
Цитата Сообщение от zayats80888 Посмотреть сообщение
А что ему мешает вместо этого (в 33 строке)
а чем вам 40 строка не устраивает?
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
#include <iostream>
using namespace std;
 
template<typename T>
constexpr bool is_int_v = std::is_same<T, int>::value; /// C++14
 
template<typename T>
class Array
{   public:
        static_assert(is_int_v<T>, "");
        int N;
        int* mass;
        explicit  Array(int n)
        {   N = n;
            mass = new int[n];
            for(int i = 0; i < n; i++)
            {   cin >> mass[i];
            }
        }
       ~Array(){   delete[] mass;}
        
        void Case()
        {
            int counter = 0;
            for (int i = 0; i < N; i++)
            {   counter += mass[i];
            }   cout << "counter = " << counter/N;
        }
};
 
///----------------------------------------------------------------------------:
int main()
{   //Array<int> a(5);  // Успех!
    //a.Case();
    
    ///---------------------------------------|
    /// Типы отличные от int запрещены!       |
    ///---------------------------------------:
    //Array<char>   a(5); // Ошибка компиляци (
    Array<double> a(5); // Ошибка компиляци (
}
0
zayats80888
21.04.2020, 18:09
  #7

Не по теме:

ха.... ха....

0
168 / 90 / 44
Регистрация: 22.09.2019
Сообщений: 399
21.04.2020, 18:14 8
Так сделайте же
Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
 
template <typename T>
class Array
{   public:
    int N;
    T* mass;
    Array(T n)
    {   N = n;
        mass = new T[N];
        for(int i = 0; i < N; i++)
        {   cin >> mass[i];
        }
    }
    ~Array()
    {   delete[] mass;
    }
 
    void Case()
    {
        int counter = 0;
        for (int i = 0; i < N; i++)
        {   counter += mass[i];
        }   cout << "counter = " << counter/N;
    }
};
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{   Array<int> a(5);  // Успех!
    a.Case();
 
 
    Array<char>   b(5);
    b.Case();
    Array<double> c(5);
    c.Case();
}
0
Модератор
Эксперт С++
13710 / 10910 / 6476
Регистрация: 18.12.2011
Сообщений: 29,133
21.04.2020, 18:20 9
как-то неправильно сделан подход к понятиям шаблона.
Для таких случаев придумана специализация шаблона
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
#include <iostream>
using namespace std;
 
template <typename T>
class Array // общий шаблон
{
public:
    int N;
    T* mass;
    Array<T>(int n)
    {
        N = n;
        mass = new T[n];
        for (int i = 0; i < n; i++)
        {
            cin >> mass[i];
        }
    }
    ~Array()
    {
        delete[] mass;
    }
 
    void Case()
    {
        T counter = 0;
        for (int i = 0; i < N; i++)
        {
            counter += mass[i];
        }   
        cout << "counter = " << counter / N;
    }
};
 
template <>
class Array<int> // специализация для int
{
public:
    int N;
    int* mass;
    Array(int n)
    {
        N = n;
        mass = new int[n];
        for (int i = 0; i < n; i++)
        {
            cin >> mass[i];
        }
    }
    ~Array()
    {
        delete[] mass;
    }
 
    void Case()
    {
        int counter = 0;
        for (int i = 0; i < N; i++)
        {
            counter += mass[i];
        }
        cout << "total counter = " << counter;
    }
};
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{
    Array<int> a(5); // используется специализация
    a.Case();
    Array<double> b(5); // используется общий шаблон
    b.Case();
}
1
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.04.2020, 18:25 10
Цитата Сообщение от zss Посмотреть сообщение
Для таких случаев придумана специализация шаблона
Ну так достаточно специализировать один метод:
C++
1
2
3
4
5
6
7
8
9
10
template <>
void Array<int>::Case()
{
    int counter = 0;
    for (int i = 0; i < N; i++)
    {
        counter += mass[i];
    }
    cout << "total counter = " << counter;
}
0
Модератор
Эксперт С++
13710 / 10910 / 6476
Регистрация: 18.12.2011
Сообщений: 29,133
21.04.2020, 18:38 11
Еще один способ такой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <typeinfo>
 
    void Case()
    {
        const char* name = typeid(*mass).name();
        if (strcmp(name, "int") == 0)
        {
            T counter = 0;
            for (int i = 0; i < N; i++)
                counter += mass[i];
            cout << "counter = " << counter / N;
        }
        else
            cout << "Can't count\n";
    }
0
373 / 316 / 65
Регистрация: 14.10.2014
Сообщений: 1,341
21.04.2020, 18:56 12
zss, вы меня опередили

FaceProgrammist,
вот готовый способ:

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
// ConsoleApplication9.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
 
#include <iostream>
 
#include <typeinfo>
#include <cstring>
 
using namespace std;
template <typename T>
class Array {
public:
    int N;
    Array(int N)
    {
        this->N = N;
 
    }
    T* mass = new T[N];
    void Case()
    {
        cout << "Введите mass[n] \n";
        cin >> mass[0];                   // здесь изначально было cin >> mass[N] - но это ошибка
        if (strncmp(typeid(mass[0]).name(), "int", 3) == 0)
        {
            cout << "Для проверки - типа зашли сюда, а значит тип T == int \n";
            int counter = 0;
            for (int i = 0; i < N; i++)
            {
                counter += mass[i];
            }
            cout << counter / N;
        }
    }
 
};
int main()
{
    setlocale(LC_ALL, "rus");
    Array <int> a(5);
    a.Case();       
 
    system("pause");
}
0
Вездепух
Эксперт CЭксперт С++
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,876
21.04.2020, 18:56 13
Цитата Сообщение от FaceProgrammist Посмотреть сообщение
Если нельзя писать (T = int ) то подскажите ка можно
Так откуда же нам знать, что вы хотели сказать этим T = int? Что это значит?
0
373 / 316 / 65
Регистрация: 14.10.2014
Сообщений: 1,341
21.04.2020, 18:57 14
но это, если уж совсем "упарываться". Но он вполне рабочий.
0
Вездепух
Эксперт CЭксперт С++
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,876
21.04.2020, 18:57 15
Цитата Сообщение от zss Посмотреть сообщение
Еще один способ такой
Цитата Сообщение от Recrut_rf Посмотреть сообщение
вот готовый способ:
Это не "способ", это издевательство. Или это шутка?
0
373 / 316 / 65
Регистрация: 14.10.2014
Сообщений: 1,341
21.04.2020, 18:58 16
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что это значит?
Что шаблонный тип int

Добавлено через 53 секунды
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это не "способ", это издевательство
ну так я же написал, если "совсем упороться" - задачу поставили - задача решена
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
21.04.2020, 18:59 17
Цитата Сообщение от Recrut_rf Посмотреть сообщение
if (strncmp(typeid(mass[0]).name(), "int", 3) == 0)
C++
1
if constexpr (std::is_same_v<T, int>)
1
373 / 316 / 65
Регистрация: 14.10.2014
Сообщений: 1,341
21.04.2020, 19:03 18
А самый правильный способ решения задачи - как писали знатоки выше - специализация шаблона.
Другие решения данной задачи - это не более, чем показатель мастерства, типа смотрите как я могу наплевательское отношение к своим, к примеру, коллегам по работе.

Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
if constexpr (std::is_same_v<T, int>)
ещё один способ, думаю, что не последний
0
Вездепух
Эксперт CЭксперт С++
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,876
21.04.2020, 19:06 19
Цитата Сообщение от Recrut_rf Посмотреть сообщение
задачу поставили - задача решена
Ага... "Рабочий код"! Уже ли?

C++
1
2
3
4
5
6
7
#include <iostream>
#include <typeinfo>
 
int main(void)
{
    std::cout << typeid(int).name() <<std::endl;
}
Смотрим вывод

Код
i
http://coliru.stacked-crooked.... abdfa5f570

Откуда вы вдруг взяли ваш "int"???

Цитата Сообщение от Recrut_rf Посмотреть сообщение
ещё один способ, думаю, что не последний
Это не "еще один способ", это единственный способ записать именно то, что пытался записать автор вопроса.
0
zayats80888
21.04.2020, 19:06     Определение типа переменной в шаблоне
  #20

Не по теме:

Цитата Сообщение от Recrut_rf Посмотреть сообщение
ещё один способ
Не еще, а вместо. Зачем RTTI туда, да еще и так криво?

0
21.04.2020, 19:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2020, 19:06
Помогаю со студенческими работами здесь

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

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

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

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

отображение значений переменной в шаблоне ввиде картинки
Всем привет. Есть шаблон на php. в нем есть переменная $xx &lt;?php $xx = $x + 1; echo ($xx); ?&gt;...

Форма поиска в шаблоне пользовательского типа записи
Есть записи с видео. Каждая запись характеризуется: название, рубрика, само видео, дата. В...


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

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