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

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

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

Читал книга Андрея Александреску нашёл эти коды (я распрашивал как их использовать в предыдущих своих темах).
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.07.2020, 22:37
Ответы с готовыми решениями:

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

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

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

51
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
21.07.2020, 18:06  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Изменит это что-то?
Ваш пример именно то что и нужно, да вы приводили его ранее, по правде говоря сложно это для меня многие детали не понятны.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
21.07.2020, 22:37
Цитата Сообщение от Nexi99 Посмотреть сообщение
по правде говоря сложно это для меня многие детали не понятны.
Так надо разбираться, и задавать вопросы в процессе, а не создавать новые темы.
Хоть один пример до конца разберите, чтобы с уверенностью самому себе сказать, что вы все там понимаете.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
21.07.2020, 22:53
Цитата Сообщение от DrOffset Посмотреть сообщение
Хоть один пример до конца разберите, чтобы с уверенностью самому себе сказать, что вы все там понимаете.
И написать самостоятельно аналог без подсказок. Тогда точно будет понятно, всё ли усвоилось или нет.
0
8 / 8 / 0
Регистрация: 15.02.2020
Сообщений: 195
21.07.2020, 23:00
Nexi99, это queue
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
22.07.2020, 19:18  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Так надо разбираться, и задавать вопросы в процессе, а не создавать новые темы.
Хоть один пример до конца разберите, чтобы с уверенностью самому себе сказать, что вы все там понимаете.
так в том то и дело человек видно шарит в этих штуках соединил много модулей, первые 2 блока понимаю а дальше так уже загружено что нужно подетально спрашивать а что это а что это эти записи <> прямо в классах меня в ступор приводят, я то вообще не понимаю классы и все функции перевожу на функции чтобы не создавать объект класса ради того чтобы таскать эту запись по всей программе, да ещё классы имеют кучу ограничений, я их понял и сразу отказался от них а тут ещё эти угловые скобки и другие детали. Чёрт с ним я придумал как сделать по другому попроще, там всё равно это у меня будет технологично развито.
0
22.07.2020, 20:52

Не по теме:

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

0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
22.07.2020, 23:47  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
а я вас предупреждал, что вы с наскока не возьмете эту тему.
Предупреждали конечно что тут сказать.
смотрите вот строка
C++
1
typedef typename MakeList< T2, T3, T4, T5 >::Result Tail;
что означает эта запись ::Result Tail
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
23.07.2020, 14:02
Таким образом
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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
23.07.2020, 15:03
Цитата Сообщение от 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
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
23.07.2020, 17:23  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Только я боюсь, что зря потерял время на объяснение
Почему зря, я конечно этого не знал это нужно как вы пишите изучать.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
18.10.2020, 07:15  [ТС]
Цитата Сообщение от 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
18.10.2020, 08:41

Не по теме:

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

0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
18.10.2020, 13:44
Цитата Сообщение от 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
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
18.10.2020, 20:22  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Это специализация шаблонов и их содержимого для разных частных случаев.
я так понимаю что не в зависимости от того есть в шаблоне параметры или нету у нас появляется возможность использовать синтаксис struct tomato<unsigned char>

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

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Тебе уже советовали книги, которые надо почитать. Там всё есть.
говорю что нету одна вода, на блогах и форумах и ваших сообщениях больше пользы чем там написано.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.10.2020, 22:06
Цитата Сообщение от Nexi99 Посмотреть сообщение
говорю что нету одна вода, на блогах и форумах и ваших сообщениях больше пользы чем там написано.
Почему же я там нашел всё что нужно?
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
18.10.2020, 22:29  [ТС]
Цитата Сообщение от Nexi99 Посмотреть сообщение
как используются Т4 и Т5?
извиняюсь они пока пусты потому что имеют значения по умолчанию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2020, 22:29

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru