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

Не получается разобраться с кодом инстанцирования кортежа

20.10.2020, 20:13. Показов 6972. Ответов 97
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ниже будет написан код и я по модульно буду сам задавать вопросы, специфику то понял но много не понятно.
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
7
class MakeList
{
    typedef typename MakeList< T2, T3, T4, T5 >::Result Tail;
 
public:
    typedef Typelist<T1, Tail> Result;
};
который идёт за 1ой структурой struct Typelist. Значит
эту строку typedef typename MakeList<T2, T3, T4, T5>::Result Tail; я понимаю так, в поле MakeList<T2, T3, T4, T5> мы находим Result и назначаем всей этой цепочке имя Tail. Возникает вопрос откуда мы взяли элемент Result, если он не возник, он описан в public: который находится ниже этой строки?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.10.2020, 20:13
Ответы с готовыми решениями:

Не получается разобраться с кодом .
Пишу программу текстовый редактор , программа почти готова но не хватает печати , недавно нашол пример печати ( спасибо медведю Вини-Пуху...

Не получается разобраться с кодом (структуры)
Есть выдержка из программы: struct BAZA// структура база { char name ; char fam ; char otch ; ...

Не могу разобраться разобраться с кодом меню
Добрый день. Я понимаю, что тут все, наверное, элементарно. Но я только начала изучение js и пока для меня все страшно и сложно. Проблема...

97
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
17.12.2020, 08:44
Студворк — интернет-сервис помощи студентам
линк чтобы авторские права не нарушать
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
20.12.2020, 22:15  [ТС]
Про мой вопрос о создании числовых списков говорит здесь 37.53-42.48. Оставили бы код снизу или что
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<int i>struct uu{static const int value=i;};
template<template<int>class F, int K,int i>
struct generat1{
typedef cons<uu<F><i>::value>;
typename generat1<F,K,i+1>::value>value;};
 
template<template<int>class F,int K>
struct generat1<F,K,K>{
typedef ail value;
};
 
template<template<int>class F,int K>
struct generat{
typedef typename generat<F,K,0>::value value;
};
Код с ошибками не разглядеть не скомпилировать измундохался, да и хоть бы построчно логику и взаимосвязь данных объяснил, да идейный мужик но с такими лекциями и за 20 лет программировать не научишься на сайтах и блогах больше информации найдёшь. Да и честно говоря видно по нём тяжеловато объясняется, г есть г, что-то нормальное создать. Год жизни коту подхвост столько идей в голове последние месяцы только и изучал это. Интересно для прикола сколько будет стоить выполнить мою задачу где нужно инстанцировать одну структуру?
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
20.12.2020, 22:38
Цитата Сообщение от Nexi99 Посмотреть сообщение
сколько будет стоить выполнить мою задачу где нужно инстанцировать одну структуру?
Дофига. И не потому что задача сложная, а потому что ее нормально сформулировать не можешь. Значит надо будет формулировать за тебя. Сесть вот так напротив и допрашивать с пристрастием: "Это? Нет? Тогда это? Опять нет. Тогда это? А может это?", ну и т.д. Это дорого стоит, потому что все нервы оставишь на этом допросе, я уж не говорю про время, которое на это уйдет.

Цитата Сообщение от Nexi99 Посмотреть сообщение
измундохался
Дорогой, это потому что ты, образно говоря, полез в проектирование ядерных реакторов, толком не изучив школьную физику. Можешь ругаться на меня, как эта дамочка JeyCi, но я всегда говорю правду. А правда в том, что ты бездарь. Хочешь вроде что-то сделать, а реально делать не хочешь. Для таких людей раньше было название - "прожектёр". Ты пойми одно, на каждый уровень развития человеческих навыков существует свой уровень повествования. Есть литература для начинающих, где все разжёвано. Есть литература для профессионалов, экспертов. А есть уже такие люди, которые сами пишут литературу. Так вот, метапрограммированием начинающие не занимаются, потому в литературе и статьях, которые ему посвящены, ничего до косточек разжёвывать не будут, и это нормально. А ты самый что ни на есть начинающий, по уровню образования. Так что, чтобы твои проекты перестали быть прожектами, иди тщательно учи основы, а потом с должным уровнем понимания возвращайся к этой теме. А иначе ничего у тебя не получится и за 50 лет. КПД не тот.
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
21.12.2020, 05:22
Цитата Сообщение от Nexi99
Хоть бы построчно логику и взаимосвязь данных объяснил
Вы же понимаете, что C++ -- не построчный язык. Контекстная и прочая взаимосвязь есть между синтаксическими конструкциями, а не между строчками. Строчки имеют значение (отличное от пробелов) вне литералов в кавычках только на этапах препроцессинга.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
11.11.2022, 21:32  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Шаблон, который вы видите - это рекурсивный шаблон.
Можно ли избавиться от записи T2, T3, T4, T5 на 19-ой строке в 1ом посте темы, например вставить туда алгоритм который посчитает список рекурсивно сам? Имеется в виду чтобы не писать через запятую.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
11.11.2022, 22:12
Nexi99, можно. В С++11 через parameter pack.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
11.11.2022, 23:48  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
через parameter pack.
я думал подстановку какую нить через структуру сделать, не всегда удобно через запятую писать эти элементы.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
12.11.2022, 21:37  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В С++11 через parameter pack.
Эта строка считает длинну кортежа?
C++
1
enum { value = 1 + Length<U>::value };
Добавлено через 11 минут
Да мне когда-то пользователь объяснил.
А здесь индекс идёт в обратную сторону
C++
1
2
3
4
5
template <class Head, class Tail, unsigned int Index>
struct TypeAt<Typelist<Head, Tail>, Index>
{
    typedef typename TypeAt<Tail, Index - 1>::Result Result;
};
значит программа знает длину списка которая строиться здесь
C++
1
2
3
4
5
6
7
class MakeList
{
    typedef typename MakeList< T2, T3, T4, T5 >::Result Tail;
 
public:
    typedef Typelist<T1, Tail> Result;
};
Но этот класс MakeListещё не вызван. Мысли в слух. Сложно даётся эта тема.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
13.11.2022, 16:36  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
чертеж для типа
Такой вопрос. Значит вот допустим код из темы.
C++
1
2
3
4
5
6
7
8
9
10
11
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;
};
Можно ли в строке typedef Typelist<T1, Tail> Result; узнать сколько байт занимает Tail и с учётом этой переменной учсложнить вырожение?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
13.11.2022, 16:39
Nexi99, sizeof вам скажет сколько байт.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
13.11.2022, 16:45  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
вам скажет сколько байт.
а там если возвращать память на каждой итерации рекурсии сколько байт будет там за весь список или за каждый элемент по отдельности должнно быть?
С учётом такого списка
C++
1
Tuple<int, char, double> tpl;
сколько байт будет на каждой итерации?

Добавлено через 2 минуты
Ну например сначала за int(за него не будет он же T1 я говорю про Tail), потом за int+char, потом за int+char+double? Или за каждый элемент вернёт память? За char отдельно и за double отдельно.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
13.11.2022, 17:21
Nexi99, смотря как напишете. Что сделать-то нужно? Сумму размеров всех элементов посчитать?
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
13.11.2022, 17:36  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
смотря как напишете
а в таком виде, когда оно крутиться сколько получается при просмотре элемента Tail?
Цитата Сообщение от DrOffset Посмотреть сообщение
Что сделать-то нужно?
Нужно объединить 2 списка этот из темы и вот этот Не могу получить доступ к полям структуры, структура является элементом рекурсивного списка. Идея такая. 0й индекс кортежа char, 1ый индекс short, 2ой структура на 3 байта, 3ий int, 4 5 6 ый структуры на 5 6 7 байт, 7ой индекс long long, 8ой структура на 16 байт(long long*2). Всего 9полей.

Добавлено через 1 минуту
Я наверное тему сделаю пока спрашиваю как распределяется память.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
13.11.2022, 17:51
Цитата Сообщение от Nexi99 Посмотреть сообщение
сколько получается при просмотре элемента Tail?
На первой итерации размер TupleImpl<U, I + 1> будет char + double + выравнивание.
Сам по себе Tail служит только по навигации по списку, его размер нигде не используется.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
13.11.2022, 21:09  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
будет char + double + выравнивание.
значит оно плюсует к тому что уже пройдено(это если фиксировать а так понятно что оно не фиксирует оно просто идёт дальше как вы объяснили). а не по отдельности считает, тут нужно внимательно считать.

Добавлено через 6 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
На первой итерации размер TupleImpl<U, I + 1>
значит внутри класса нужно создать переменную которая будет этот размер хранить и распределять алгоритмом или внутри шаблона можно такую сделать переменную.

Добавлено через 2 часа 57 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
итерации
А по 1ому элементу списка можно прочитать, если да покажите как такое записать?

Добавлено через 8 минут
результат можно записать в константу прямо в этом класе. Просто хочу понять как это делается.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
14.11.2022, 22:28  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
На первой итерации
Ещё такой вопрос внутри MakeList объявлена закрытая переменная Tail она построена на базе/типе MakeList< T2, T3, T4, T5 >, я так понимаю Tail может иметь какой угодно тип чтобы рекурсия запустилась(если конечно логика построена правильно, шаблон же можно как угодно использовать)?
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
03.02.2023, 18:53  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
шаблон - это чертеж для типа. Что-то "возникает" в нем только тогда, когда он начинает инстанцироваться - т.е. когда подставляются какие-то аргументы шаблона.
скажите а передача функции operator которая находится внутри структуры CoutPrinter по примеру
C++
1
TupleForEeach(tpl, CoutPrinter());
это передача по указателю ссылке, как это работает что это за способ передачи функции в качестве аргумента в другую функцию?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
03.02.2023, 21:11
Nexi99, здесь передается объект типа CoutPrinter, по значению. Функции не передаются здесь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.02.2023, 21:11

Отсортировать Dictionary по ключу состоящий из кортежа, и отсортировать по второму элементу кортежа
В общем, у меня есть такой код: Dictionary&lt;(int, int), int&gt; _data = new Dictionary&lt;(int, int), int&gt;(); как его отсортировать...

Разобраться с кодом
Для чего нужна вот эта часть кода? зачем нужен этот конструктор ? как он работает? // класс строки public class my_string ...

Разобраться с кодом
Эта функция заставляет работать ctrl+'русская буква' в tkinter. Не понимаю, что делает первая строчка в функции. ...

Разобраться с кодом
Ребят, помогите разобраться. У меня мозг уже потёк. Подскажите пожалуйста, где и как это исправлять. namespace System { ...

Разобраться с кодом
Помогите, пожалуйста, разобраться с кодом)) Только недавно начала изучать с++ и не могу понять что здесь делается в этой задаче ...


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

Или воспользуйтесь поиском по форуму:
98
Ответ Создать тему
Новые блоги и статьи
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru