Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
1

Как организовать перебор типов через цикл в 98 стандарте с++?

20.07.2020, 22:37. Показов 3356. Ответов 51
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Читал книга Андрея Александреску нашёл эти коды (я распрашивал как их использовать в предыдущих своих темах).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class T, class U>
struct Typelist
{
typedef T head; 
typedef U Tail;
};
template <class TList, unsigned int index> struct TypeAt;
        
        template <class Head, class Tail>
        struct TypeAt<Typelist<Head, Tail>, 0>
        {
            typedef Head Result;
        };
 
        template <class Head, class Tail, unsigned int i>
        struct TypeAt<Typelist<Head, Tail>, i>
        {
            typedef typename TypeAt<Tail, i - 1>::Result Result;
        };
Если возможно создать кортёж, можно ли с помощью этих технологий организовать перебор элементов через цикл (очень надо помогите сделать)?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2020, 22:37
Ответы с готовыми решениями:

LocalStorage - как организовать перебор элементов по определенному признаку через цикл for
Например, есть localStorage и в нем находится несколько объектов - это товары. *Наполняем...

Перебор файла посимвольно, как организовать цикл, работающий до конца файла.
Нужно перебрать файл посимвольно и, учитывая спецсимволы записать содержимое файла в Memo1....

Цикл: Как грамотно организовать цикл с получением количества верных и неверных ответов?
Доброго времени суток, товарищи. Вот есть у меня два рандомно генерируемых числа, проверка...

Перевести строку, содержащую путь к файлу в стандарте ANSI С, в строку в стандарте фирмы Borland
ЗАДАНИЕ: Согласно стандарту ANSI С, при задании пути к файлу в программе на языке С, каталоги...

51
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
21.07.2020, 18:06  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Изменит это что-то?
Ваш пример именно то что и нужно, да вы приводили его ранее, по правде говоря сложно это для меня многие детали не понятны.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
21.07.2020, 22:37 22
Цитата Сообщение от Nexi99 Посмотреть сообщение
по правде говоря сложно это для меня многие детали не понятны.
Так надо разбираться, и задавать вопросы в процессе, а не создавать новые темы.
Хоть один пример до конца разберите, чтобы с уверенностью самому себе сказать, что вы все там понимаете.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
21.07.2020, 22:53 23
Цитата Сообщение от DrOffset Посмотреть сообщение
Хоть один пример до конца разберите, чтобы с уверенностью самому себе сказать, что вы все там понимаете.
И написать самостоятельно аналог без подсказок. Тогда точно будет понятно, всё ли усвоилось или нет.
0
8 / 8 / 0
Регистрация: 15.02.2020
Сообщений: 195
21.07.2020, 23:00 24
Nexi99, это queue
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
22.07.2020, 19:18  [ТС] 25
Цитата Сообщение от DrOffset Посмотреть сообщение
Так надо разбираться, и задавать вопросы в процессе, а не создавать новые темы.
Хоть один пример до конца разберите, чтобы с уверенностью самому себе сказать, что вы все там понимаете.
так в том то и дело человек видно шарит в этих штуках соединил много модулей, первые 2 блока понимаю а дальше так уже загружено что нужно подетально спрашивать а что это а что это эти записи <> прямо в классах меня в ступор приводят, я то вообще не понимаю классы и все функции перевожу на функции чтобы не создавать объект класса ради того чтобы таскать эту запись по всей программе, да ещё классы имеют кучу ограничений, я их понял и сразу отказался от них а тут ещё эти угловые скобки и другие детали. Чёрт с ним я придумал как сделать по другому попроще, там всё равно это у меня будет технологично развито.
0
DrOffset
22.07.2020, 20:52
  #26

Не по теме:

Nexi99, а я вас предупреждал, что вы с наскока не возьмете эту тему.

0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
22.07.2020, 23:47  [ТС] 27
Цитата Сообщение от DrOffset Посмотреть сообщение
а я вас предупреждал, что вы с наскока не возьмете эту тему.
Предупреждали конечно что тут сказать.
смотрите вот строка
C++
1
typedef typename MakeList< T2, T3, T4, T5 >::Result Tail;
что означает эта запись ::Result Tail
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
23.07.2020, 14:02 28
Таким образом
C++
1
2
3
4
#include <string>
typedef 
     std::basic_string<int>::traits_type::int_type 
    ((bint));
типу std::basic_string< int >::traits_type::int_type
мы даём короткое название bint.

В Вашем примере T2, T3, T4, T5 - параметры шаблона MakeList, "внутри" которого определён тип Result.
typename - подсказка компилятору, что следующую синтаксическую конструкцию нужно читать как тип.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
23.07.2020, 15:03 29
Цитата Сообщение от Nexi99 Посмотреть сообщение
что означает эта запись ::Result Tail
В первую очередь :: - это разрешение области видимости. ОБласти видимости - это фундаментальное понятие, подробности хорошо читаются в учебниках (см., например, Липпман - 5-е издание: глава 3, параграф 3.1, глава 7, параграф 7.4).

Тип (псевдоним) Tail объявляется в текущем шаблоне MakeList. Result, запрашиваемый через :: он тоже берет из текущего шаблона, но инстанцированного другим набором типов. Получается шаблонная рекурсия.

Пример:
  1. Передаем набор типов int, char, double в шаблон MakeList c параметрами по умолчанию T1 = NullType, T2 = NullType, T3 = NullType, T4 = NullType.
  2. При подстановке соответственно заменяется T1 = int, T2 = char, T3 = double. T4 остается равным NullType.
  3. При typedef-объявлении Tail используется этот же шаблон MakeList, но с другим набором параметров, т.е. T1 оставляем в стороне, набор параметров такой: T1 = char, T2 = double, T3 = NullType, T4 = NullType.
  4. При typedef-объявлении Result создается псевдоним типа TypeList<T1, Tail>.
    Т.е. с конкретными типами получается TypeList<int, Tail[1]>.
  5. Tail[1], как мы помним, это Result от шаблона MakeList с T1 = char, T2 = double, T3 = NullType, T4 = NullType.
    При таком инстанцировании его Result будет TypeList<char, Tail[2]>
  6. Tail[2], по тому же принципу - это Result от шаблона MakeList с T1 = double, T2 = NullType, T3 = NullType, T4 = NullType.
    При таком инстанцировании его Result будет TypeList<double, Tail[3]>
  7. Tail[3], попадет с специализацию, которая срабатывает если все типы в шаблоне MakeList заданы как NullType.
    При таком инстанцировании его Result будет NullType
  8. Если собрать все вместе, то финальный Result (т.е. Result из самой первой инстанциации шаблона с T1 = int, T2 = char, T3 = double, T4 = NullType) будет:
  • TypeList<int, Tail[1]>
  • Вместо Tail[1] подставляем TypeList<char, Tail[2]>
  • Получаем TypeList<int, TypeList<char, Tail[2]> >
  • Вместо Tail[2] подставляем TypeList<double, Tail[3]>
  • Получаем TypeList<int, TypeList<char, TypeList<double, Tail[3]> > >
  • Вместо Tail[3] подставляем NullType
Т.е. Result = TypeList<int, TypeList<char, TypeList<double, NullType> > >

Не по теме:

Tail c цифрой - это условное обозначение, псевдокод, чтобы отличать Tail`ы c разных уровней рекурсии.
Tail - c английского переводится как "хвост". Это должно помочь пониманию.


Таким образом видно, что шаблон MakeList нужен, чтобы не писать конструкцию
C++
1
TypeList<int, TypeList<char, TypeList<double, NullType> > >
вручную. А вместо этого писать более короткую
C++
1
MakeList<int, char, double>::Result

Только я боюсь, что зря потерял время на объяснение, потому что вы пропустили базовое обучение.
Т.е. чтобы нормально понимать все это, вам по крайней мере нужно было осилить учебник Липпмана целиком, и, возможно, что-то еще после этого дополнительно почитать по шаблонам, например у Вандевурда.
2
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
23.07.2020, 17:23  [ТС] 30
Цитата Сообщение от DrOffset Посмотреть сообщение
Только я боюсь, что зря потерял время на объяснение
Почему зря, я конечно этого не знал это нужно как вы пишите изучать.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
18.10.2020, 07:15  [ТС] 31
Цитата Сообщение от DrOffset Посмотреть сообщение
template <>
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <iostream>
 
 
template <class T, class U>
struct Typelist
{
    typedef T head; 
    typedef U Tail;
};
class NullType 
{ };
 
template < 
    typename T1 = NullType, typename T2 = NullType, typename T3 = NullType,
    typename T4 = NullType, typename T5 = NullType
>
class MakeList
{
    typedef typename MakeList< T2, T3, T4, T5 >::Result Tail;
 
public:
    typedef Typelist<T1, Tail> Result;
};
 
template <>
class MakeList<>
{
public:
    typedef NullType Result;
};
 
template <class TList> struct Length;
template <> 
struct Length< NullType >
{
    enum { value = 0 };
};
template <class T, class U>
struct Length< Typelist<T, U> >
{
    enum { value = 1 + Length<U>::value };
};
 
template <class TList, unsigned int Index> struct TypeAt;
 
template <class Head, class Tail>
struct TypeAt<Typelist<Head, Tail>, 0>
{
    typedef Head Result;
};
 
template <class Head, class Tail, unsigned int Index>
struct TypeAt<Typelist<Head, Tail>, Index>
{
    typedef typename TypeAt<Tail, Index - 1>::Result Result;
};
 
//============ Примитивная реализация Tuple с использованием списка типов ==================
 
template <typename T, unsigned int I>
class TupleElement
{
public:
    T & get() 
    {
        return m_value;
    }
private:
    T m_value;
};
 
template <typename List, unsigned int I = 0>
class TupleImpl;
    
template <typename T, typename U, unsigned int I>
class TupleImpl<Typelist<T, U>, I>
    : public TupleElement<T, I>
    , public TupleImpl<U, I + 1>
{ };
template <unsigned int I>
class TupleImpl<NullType, I>
{ };
 
template <
    typename T1 = NullType, typename T2 = NullType, typename T3 = NullType,
    typename T4 = NullType, typename T5 = NullType    
>
class Tuple : public TupleImpl<typename MakeList<T1, T2, T3, T4, T5>::Result>
{
    typedef typename MakeList<T1, T2, T3, T4, T5>::Result ElementsList;
        
public:
    template <unsigned int Index>
    typename TypeAt<ElementsList, Index>::Result & get() 
    {
        TupleElement<typename TypeAt<ElementsList, Index>::Result, Index> & el = *this;
        return el.get();
    }
    enum 
    {
        Size = Length<ElementsList>::value
    };
    
};
 
//======================== Эмуляция перебора в цикле ====================================
template <typename Tuple, unsigned int I = Tuple::Size>
struct TupleForEach_ 
{
    template <typename F>
    static void run(Tuple & tpl, F f) 
    {
        TupleForEach_<Tuple, (I - 1)>::run(tpl, f);
        f(tpl.template get<(I - 1)>());
    }
};
 
template <typename Tuple>
struct TupleForEach_<Tuple, 0> 
{
    template <typename F>
    static void run(Tuple & tpl, F f) { }
};
 
template <typename Tuple, typename F>
void TupleForEeach(Tuple & x, F f) 
{
    TupleForEach_<Tuple>::run(x, f);
}
//=======================================================================
 
struct CoutPrinter {
    template <typename T>
    void operator()(T const & v) const 
    {
        std::cout << v << ' '; 
    }
};
 
int main()
{
    Tuple<int, char, double> tpl;
    
    tpl.get<0>() = 1;
    tpl.get<1>() = 'a';
    tpl.get<2>() = 3.14;
    
    TupleForEeach(tpl, CoutPrinter());
}
Для чего здесь нужен пустой шаблон повторяется не однократно?
0
Croessmah
18.10.2020, 08:41
  #32

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
а я вас предупреждал, что вы с наскока не возьмете эту тему.
Как в воду смотрел. )

0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
18.10.2020, 13:44 33
Цитата Сообщение от Nexi99 Посмотреть сообщение
Для чего здесь нужен пустой шаблон повторяется не однократно?
подобный синтаксис ?
C++
1
2
3
4
5
template  < class T > class tomato;
 
template<> // специализация tomato для unsigned char
struct tomato<unsigned char> {
};
Это специализация шаблонов и их содержимого для разных частных случаев.
https://en.cppreference.com/w/... ialization
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
18.10.2020, 20:22  [ТС] 34
Цитата Сообщение от politoto Посмотреть сообщение
Это специализация шаблонов и их содержимого для разных частных случаев.
я так понимаю что не в зависимости от того есть в шаблоне параметры или нету у нас появляется возможность использовать синтаксис struct tomato<unsigned char>

Добавлено через 59 секунд
Цитата Сообщение от Croessmah Посмотреть сообщение
а я вас предупреждал, что вы с наскока не возьмете эту тему.
Разбираюсь немного книги читал но там полезной и конкретной информации по этим вопросам нет. В любом случае нужно разбираться.
0
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
18.10.2020, 21:04 35
У класса, созданного по шаблону, не может не быть параметров. Специализация нужна чтобы описать специфическое, отличное от "основного" поведение для какого-то набора параметров.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
18.10.2020, 21:31  [ТС] 36
Цитата Сообщение от Zirak Посмотреть сообщение
У класса, созданного по шаблону, не может не быть параметров.
но тут же нету параметров
C++
1
2
3
template<>
struct tomato<unsigned char> {
};
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
18.10.2020, 21:49 37
Цитата Сообщение от Nexi99 Посмотреть сообщение
книги читал но там полезной и конкретной информации по этим вопросам нет.
Да ты гонишь.
Тебе уже советовали книги, которые надо почитать. Там всё есть.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
18.10.2020, 21:57  [ТС] 38
Цитата Сообщение от DrOffset Посмотреть сообщение
T1 = int, T2 = char, T3 = double.
как используются Т4 и Т5?

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Тебе уже советовали книги, которые надо почитать. Там всё есть.
говорю что нету одна вода, на блогах и форумах и ваших сообщениях больше пользы чем там написано.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
18.10.2020, 22:06 39
Цитата Сообщение от Nexi99 Посмотреть сообщение
говорю что нету одна вода, на блогах и форумах и ваших сообщениях больше пользы чем там написано.
Почему же я там нашел всё что нужно?
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
18.10.2020, 22:29  [ТС] 40
Цитата Сообщение от Nexi99 Посмотреть сообщение
как используются Т4 и Т5?
извиняюсь они пока пусты потому что имеют значения по умолчанию.
0
18.10.2020, 22:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2020, 22:29
Помогаю со студенческими работами здесь

Как организовать перебор png файлов из ресурса?
Помогите решить проблемму: Как можно организовать следующее: есть обьект picturebox, есть ресурс:...

Как организовать последовательный перебор файлов в каталоге, для их чтения?
Не подскажет ли кто, как организовать последовательный перебор файлов в каталоге, для их чтения....

Как организовать цикл (С++)?
Как организовать цикл (С++), опроса (любой) клавиши клавиатуры? Например до 10 раз. Кто подскажет...

Как организовать цикл?
Здравствуйте. Вообщем имеется уравнение,в правой части которого идёт бесконечное...

Как организовать цикл
Добрый Вечер! Пытаюсь создать консольную игру &quot;Сапер&quot;. Не могу понять как запустить цикл,...

Как правильно организовать цикл for?
Имеем два числа, например 30 и 42 Нужно в цикле перебрать их например 3 раза по следующему...


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

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