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

Приведите пример инстанцирования 1го объекта

21.11.2020, 21:34. Показов 3729. Ответов 25
Метки нет (Все метки)

Есть такой пример.
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());
}
Я провёл такой эксперимент
C++
1
2
3
4
5
6
template <typename F>
static void run(Tuple & tpl, F f)
{char dd[I]={12};cout<<sizeof(dd)<<" "<<*dd<<en;
TupleForEach_<Tuple, (I - 1)>::run(tpl, f);
f(tpl.template get<(I - 1)>());
}
На каждой итерации и в правду объявляется массив, который занимает разное количество байт с разницей в единицу. Минимальный размер 1, максимальный равен сумме всех рекурсий + 1ца. По сути чтобы объявить массив таким образом должна быть константа с периодом времени компиляции, и I - 1 как раз и выполняет такую роль.
Возникает вопрос а можно ли инстанцировать один объект несколько раз. Пример нужно сделать несколько разных структур.
C++
1
2
3
4
5
template <unsigned const int T>
struct Typelist{
typedef struct Typelist1{
char ii[T];
};};
Чтобы массив ii имел размер от 1го до 4ёх байт. Возможно ли написать такую рекурсию?

Хотелось бы увидеть пример как это будет выглядеть.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2020, 21:34
Ответы с готовыми решениями:

Приведите пример.
Программа с использованием функции без параметров. Можете разьяснить все как есть

приведите пример к функциям
Можете привести примеры на функции. Код. заранее спасибо!!!

Приведите пример инвариантности
Если можно, то объясните на конкретном примере(желательно лёгком в понимании) что такое инвариантность. На словах понятно, что это...

25
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
24.12.2020, 10:19
Цитата Сообщение от Nexi99 Посмотреть сообщение
Я не использую классы в программировании, то что вы решаете через классы и рекурсии я решаю через обычные переменные что более гибко, но бывают ситуации когда такие штуки дают небольшую экономию в коде или уменьшают нагрузку. Единственное применение классам за мои 5 лет есть в инстанцировании больше нигде в них пользы нет.
Почему бы Вам тогда не перейти с C++ на С11, С99 или С17 ?
http://www.open-std.org/jtc1/s... /n1570.pdf
То, для чего не хватает удобных возможностей в С11, можно реализовать и без помощи template class,
Например, генерируя текст программмы на Си другой своей программой. Это более экономично, чем изобретение своего языка, компилятора для него и своей ОС ( а также своей собственной архитектуры ЭВМ на 0 и 1 ).
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
31.12.2020, 01:53  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
То, для чего не хватает удобных возможностей в С11, можно реализовать и без помощи template class,
Например, генерируя текст программмы на Си другой своей программой. Это более экономично, чем изобретение своего языка, компилятора для него и своей ОС ( а также своей собственной архитектуры ЭВМ на 0 и 1 ).
Ну мне этот пример из 1го поста очень понравился, скажем так специфика понимания и другие приводили тоже по вопросу, но всё равно их с первым постом соединять нужно. Также я понял почему не существует других типов данных их возможно только построить с помощью кортежей. Я то сделал это с помощью обычных переменных что позволило использовать 3,5,6,7 байт не знаю реализую ли я это ну буду делать конечно. К сожалению инстанцирование для меня не даётся по прежнему где чего написать, тут по ходу слишком много заложено а у меня с памятью и запоминанием очень плохо всё достаётся тяжёлым трудом.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
28.09.2021, 05:19  [ТС]
На 29 строке объявлена переменная вернее даже создана копия typedef NullType Result; она нужна чтобы класс на 17ой строке class MakeList зашёл в рекурсию когда будет создан объект?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
28.09.2021, 19:54
Nexi99, это не переменная и не объект, и не копия. Это тип.
Этот вариант специализации нужен для обработки случая, когда в списке (в параметрах шаблона) нет заданных пользователем типов. Эта ситуация, в частности, наступает в самом конце рекурсивного инстанцирования, когда все заданные пользователем типы кончились.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
28.09.2021, 21:58  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
это не переменная и не объект, и не копия. Это тип.
Этот вариант специализации нужен для обработки случая, когда в списке (в параметрах шаблона) нет заданных пользователем типов. Эта ситуация, в частности, наступает в самом конце рекурсивного инстанцирования, когда все заданные пользователем типы кончились.
Это всё дело резко раскрывается на последнем этапе, до меня рекурсии такие до сих пор сложная задача и не отдебажить и ничего сделать практически нельзя.

Добавлено через 27 минут
Все эти инстанции раскрываются одновременно?

Добавлено через 16 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
нет заданных пользователем типов
а можно ли вместо списка поставить выражение что-то вроде:
C++
1
2
3
4
5
6
7
8
template <const int r=sizeof(long long)>struct ruct_{
static const unsigned long value = ruct_<r-1>::value; 
};
template <unsigned long t> struct ruct_<t>{ 
static const unsigned long value =<ruct_<t>::value!=1?ruct_<t>::value:1>::value;};
template <unsigned long t> struct uct_<t>{ 
char arr[t];
};
написано неправильно но смысл в том что нужно получить char arr[1] char arr[2] и так до 8ми и поставить их в качестве списка который начинается на 13ой строчке ну и использовать в этом коде далее?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
29.09.2021, 08:59
Цитата Сообщение от Nexi99 Посмотреть сообщение
отдебажить и ничего сделать практически нельзя
В данном случае если дебажить, то компилятор.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.09.2021, 08:59

Приведите пример,вывод
Привет,можете пожалуйста привести пример вывода всех файлов txt из папки,и лежащих в этой папке подпапок. Добавлено через 58 минут ...

Приведите пример класса в классе
Приведите пожалуйста пример класса в классе, так что бы в классе a были свойства и методы класса b.

Приведите пример реализации списка
как я понял по своей сути список отличается от массива тем что список исспользует не фиксированный размер памяти и располагается в...

Приведите пример использования QLayout'ов
Как я понял, с помощью QLayout'ов можно добиться того, что элементы внутри них будут в зависимости от размеров окна менять свои размеры и...

Приведите пример класса с конструкторами и деструктором
Здравствуйте ! Приведите пример Конструкторы и Деструкторы в С++ ( Напишите по понятнее код пожалуйста ) Я пищу курсовую и мне нужно...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru