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

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

20.10.2020, 20:13. Показов 6974. Ответов 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
01.12.2020, 10:25
Студворк — интернет-сервис помощи студентам

Не по теме:

Nexi99, Вы создали отдельную тему
Приведите пример инстанцирования 1го объекта
для обсуждения этого вопроса?
Изложите там подробности. Зачем нужны неработающие ссылки?
И попросите модераторов перенести в ту тему имеющие к ней сообщения.
Или попросите объединить темы.

0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
01.12.2020, 10:37
Цитата Сообщение от Nexi99 Посмотреть сообщение
но сложность в том что инстанцируется один объект а не список, а получить нужно список.
так и создайте аггрегатный класс, который будет вам выдавать список...
Цитата Сообщение от Nexi99 Посмотреть сообщение
при этом N известно заранее
ведь если есть класс одного элемента... то создать аггрегатный класс (примеров HAS-A relation полно)... там и перегрузить оператор[] доступа по индексу к элементу совокупности можно, если надо... а уже потом в элементе обращаться как вам хочется <> к его части (элемента! уже выделенного из совокупности)...
а если количество "известно заранее", то на такое количество и создавать новый аггрегатный класс... вижу так... делать не берусь - время однако... но я бы делала так...
мне кажется вы путаете контейнер для кортежА и агрегатный контейнер (да хоть тот же вектор) для совокупности этих кортежЕЙ -
1-й - это ваш элемент - индексируйте доступ к его составный частям <>...,
2-й - это ваша совокупность элементов - индексируйте доступ ко всему элементу [] целиком...... - например, в динамическом массиве (который сделайте основой агрегатного класса - ! отдельного класса, или просто возьмите класс vector для помещения в него свох кортежей)
и обращайтесь к каждому, итерируя совокупность (тем более вы даже знаете на сколько элементов - кортежей - она вам нужна)... можете при итерировании вашей совокупности выделять элемент в temp = ваш кортеж, а уже в нём temp.get<0>() и т.д., что надо...
p.s.
может этот foreach натолкнёт на мысль
p.p.s.
я просто даже затрудняюсь понять, что вас смущает, - поэтому и делать вместо вас не берусь... цикл for в аггрегатном классе оформить не сложно... а рекурсия, мне всё равно кажется излишней, если структура контейнера одна, заранее известна, и неизменна... имхо... отключаюсь... успехов

Добавлено через 4 минуты
Цитата Сообщение от politoto Посмотреть сообщение
Или попросите объединить темы.
ой не надо - лучше кратко изложить выкладки оставшегося! непонимания... но я всё равно не хочу за ТСа собирать вектор (или список) его кортежей в нужный ему по размеру контейнер (список, например) - банально, а время займёт... если я правильно поняла его задачу... то всё-таки рекурсия необязательна... достаточно, агрегировать - даже for-loop'ом
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
01.12.2020, 10:53  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
, да создал, ответов долго не было я начал спрашивать старых пользователей кто уже предлагал некоторые примеры по реализации методик по данной теме.
Цитата Сообщение от politoto Посмотреть сообщение
Изложите там подробности. Зачем нужны неработающие ссылки?
Сообщений оставлено от пользователей там не было и естественно дописать туда что либо не могу. Ссылку на эту тему я также вылаживал и тут, а пользователи кто отвечали на сообщения ен хотят переходить туда а давали ответ тут и так оно и пошло.
Цитата Сообщение от politoto Посмотреть сообщение
Зачем нужны неработающие ссылки?
ссылки работают я копипастом их вставляю а почему не вставляются я не знаю.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
01.12.2020, 12:10
Цитата Сообщение от Nexi99 Посмотреть сообщение
Во время компиляции известен список индексов и он статический и меняться не будет а вот какой из них использовать то это только в момент выполнения, нельзя ли перенастроить функцию на список индексов
вобщем, если дело в этом, то вам надо как-то убирать зависимость между функцией (создания tuple) и количеством её аргументов... имхо... как это делать - это др. вопрос (или здесь) - но кода однозначно разрастётся и полиморфизм, вероятно, в любом случае придётся делать динамическим (для runtime'а - через inheritance), не статическим (в template - для compile-time)...
или, как прозвучало:
Цитата Сообщение от Zirak Посмотреть сообщение
боюсь, тебе ничего не остаётся кроме как заранее написать switch-простыню со всеми case'ами под каждый индекс.
или использовать std::variant и его visit...
p.s.
рефакторить или нет - это уже на усмотрение ТСа...
вот чувствую, что мало кода на его тз не получится... имхо

Добавлено через 1 минуту
Цитата Сообщение от Nexi99 Посмотреть сообщение
а почему не вставляются я не знаю.
да всё там читается на programmersforum_ru -- только всё равно у каждого дизайнера вашей архитектуры вашего тз - своё видение о том, как вылазить за пределы compile-time.....

Добавлено через 18 минут
просто вы хотите сказать(определить), что надо, в runtime, а иметь это в наличии уже с момента compile-time... вот и придётся ещё там (в compile-time) заложить все возможные варианты для того, чтобы уже были в наличиии в runtime (совет от Zirak или std::variant)... а по-др никак
1
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
01.12.2020, 16:22  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
или использовать std::variant и его visit...
Не может быть такого. Даже в этой теме первый пост человек список составил и ничего не подключал в моём случае тоже самое но объект один который нужно раскрутить, тут даже первый пост перебрать можно, но мне такое тяжело даётся.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
01.12.2020, 17:46
Цитата Сообщение от Nexi99 Посмотреть сообщение
тут даже первый пост перебрать можно,
так он же так и написал
Цитата Сообщение от DrOffset Посмотреть сообщение
- т.е. когда подставляются какие-то аргументы шаблона.
а вы хотите подставлять в run-time... там уже и шаблона того не будет, только типы созданные на его основе...
т.е. ДЛЯ run-time надо, чтобы или switch-ами были уже заготовлены все возможные сочетания того, из чего вы кортеж хотите делать... или динамически создавать нужный кортеж из полиморфного класса (std::variant - это просто класс для формирования run-time полиморфизма)... ну или архитектурно разделять функцию, создающую кортеж и поставляемый в неё список нужных полей для кортежа == а это и есть полиморфное динамическое создание объекта, для которого подклассы уже должны быть скомпилированы - хоть с шаблоном, хоть поштучно -- но Класс(ы) уже должен(ны) быть в наличии -- а как будете вы его(их) в run-time'e подключать в работу - хоть switch'ами, хоть std::variant visit, хоть наследованием -- это уже дело вкуса...
я ведь правильно вас поняла, что вы думаете, что этот MyList вы в run-time'e сможете формировать? (чего и хотите)... НЕТ... не забывайте, как работают шаблоны, - во время компиляции из них формируются ВСЕ возможные типы... точка... в run-time'e у вас будут только всё, что наплодилось из шаблона, - не больше, ни меньше, ни самого шаблона...
так вот, чтобы в compile-time вы наплодили всё, что вам нужно -- #2 и посоветовал вам специализацию...
===
а чтобы динамически (динамически т.е. в run-time'e) создавать кортежи с избранными полями для MyList - уже 2 человека вам напоминают, как выбирать в run-time (хоть swith, хоть variant, хоть абстрактный класс)...... НО то из чего хотите выбирать УЖЕ должно быть скомпилировано!.. а не абстрактно описано в шаблоне... повторюсь, после компиляции шаблона уже нет, но есть все типы, созданные на основе его описания - в принципе они тоже ещё абстракции (просто статически полиморфные)...
не знаю, как ещё вам написать, что в ваш MyList вы уже ничего не подставите в run-time... но динавически (в run-time) можете выбрать лишь из имеющегося наплодившегося... и хотите вы на самом деле динамического полиморфизма!.. (а не статического полученного из шаблона)...
===
вы с полиморфизмом и способами его применения вообще знакомы?.. - там в run-time и задавайте нужные параметры для уточнения класса...
НО Класс УЖЕ должен быть, а не шаблон... точнее классы сформированные из этого шаблона... а конкретику уже в run-time уточняете в конкретных объектах от этих классов (с тем или иным набором полей для кортежа) в run-time...
всё равно, что от абстрактного класса уточнить класс-потомок -- если хотите все возможные вариации кортежей (с любым MyList набором полей) свести к общему родителю для возможности динамически выбирать нужного потомка... вобщем это уже будет динамический полиморфизм

Добавлено через 4 минуты
Цитата Сообщение от Nexi99 Посмотреть сообщение
из них использовать то это только в момент выполнения, нельзя ли перенастроить функцию на список индексов
такое только если разделить функцию и её аргументы -- там по линку, который я оставляла в #44 - на примере котов и собак - как раз то, что вам надо, -- хоть котов, хоть собак используйте параметром... вроде принцип Interface Segregation из SOLID

Добавлено через 11 минут
(только вам нужно ещё проще - single dispatching может быть достаточно в вашем случае - там же есть)
потому что нравятся или не нравятся вам коты или собаки (в смысле кортежи созданные из разного набора параметров) - вам всё равно (т.е. вы не говорили, что вы ещё и выбирать в run-time'e хотите, как с ними дальше обращаться по выбору в run'time, не по определению из класса скомпилированного)
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
01.12.2020, 18:47  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
я ведь правильно вас поняла, что вы думаете, что этот MyList вы в run-time'e сможете формировать? (чего и хотите)... НЕТ... не забывайте, как работают шаблоны, - во время компиляции из них формируются ВСЕ возможные типы... точка... в run-time'e у вас будут только всё, что наплодилось из шаблона, - не больше, ни меньше, ни самого шаблона...
так вот, чтобы в compile-time вы наплодили всё, что вам нужно -- #2 и посоветовал вам специализацию...
Я понимаю это всё смотрите. Есть структура которая будет плодится рекурсией. Я хочу чтобы так было
C++
1
2
3
4
5
6
 в шаблоне 
struct R{char y[константа рекурсии];}r1;
за tpl.get<0>() - r1.y[1];с единичным размером
за tpl.get<1>() - r1.y[2];с двоичным размером
за tpl.get<2>() - r1.y[3];здесь скрывается троичный размер
за tpl.get<3>() - r1.y[4];здесь скрывается массив размер которого будет 4ре
Как будет здесьTuple<> tpl; я не знаю список должен расплодится от одного элемента r1 внутри которого массив y

Вот смотрите на старом примере, писать лучше тут Приведите пример инстанцирования 1го объекта
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)>());
}
Здесь массив dd будет создан в зависимости от длины списка, так вот мне нужно список убрать и поставить структуру.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
01.12.2020, 20:37
Цитата Сообщение от Nexi99 Посмотреть сообщение
так вот мне нужно список убрать и поставить структуру.
вот! вы снова столкнулись со своей нелогичностью... у списка есть итератор и размер (что ещё важнее для вас) - этим всё сказано - вы можете
Цитата Сообщение от Nexi99 Посмотреть сообщение
в зависимости от длины списка
делать, что угодно... но эта длина списка вам нужна! (она как ориентир для количества шагов в рекурсии)...
а вы же хотите
Цитата Сообщение от Nexi99 Посмотреть сообщение
так вот мне нужно список убрать и поставить структуру
вы понимаете, насколько структура урезанный "класс" по сравнению со списком?..
вы создайте класс/структуру user-defined, который/ая будет реализовывать нужный вам функционал... как минимум size()
= НО ЭТО ЛИРИКА... (т.к. всё-таки говорим о шаблоне заданном, а не о понятиях библиотеки std, поэтому как назвали в шаблоне, так и понимаем -- неважно, что std понимает по-другому)
===
! главное, вы понимаете ПОЧЕМУ вам структура больше нравится, чем список? == может вы вообще не тот код адаптируете под свои нужды... напишите, чем список не устраивает и чем вам выгодна структура?.. что хотите получить взамен (кроме смены слова, которым обозвали в шаблоне, и/или смены контейнера, в который вы хотите что-то запихнуть на входе или выходе)
p.s.
кстати не забывайте - у вас шаблон - он расплодится на все родные для c++ основные типы и ваши user-defined ...
вы кстати не пояснили #2-му, почему вам его совет о специализации не понравился...

Добавлено через 5 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
поэтому должна быть специализация, которая приведет к прекращению рекурсии.
у вас же в структуре даже size'а не будет... и вообще структура - это даже не тип в отличие от списка... а лишь какая-то условно оболочка/капсула (от слова инкапсуляция), которую ещё чем-то наполнить надо... имхо...
условие выхода из рекурсии по структуре, которую ещё не сделали, - вы продумали? (по совету от #2)

Добавлено через 8 минут
p.p.s.
хотя, честно говоря, коль говорим о шаблоне, то вообще не понимаю, какой спор о словах - myList или struct... но вот sizeof лично у меня навевает те сомнения в вашей логике, которые озвучила... как и моё видение пути их преоделения озвучила - пишите свою user-defined struct в которой отметите ваш size, чтобы знать Как специализировать для прекращения рекурсии......

Добавлено через 11 минут
p/p/p/s
вот кстати в новой ветке, может, хоть нарисуйте, что есть и что надо... хоть блок-схему... хоть UML-диаграмму... а то, что-то с кодом, вы ещё не доказали, что это тот код, который можно так модифицировать, как вы хотите... имхо

Добавлено через 8 минут
и если раньше вы хотели:
Цитата Сообщение от Nexi99 Посмотреть сообщение
нельзя ли перенастроить функцию на список индексов
Добавлено через 37 секунд
то теперь вы хотите:
Цитата Сообщение от Nexi99 Посмотреть сообщение
список убрать и поставить структуру.
Добавлено через 4 минуты
где логика?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
01.12.2020, 21:26
Цитата Сообщение от Nexi99 Посмотреть сообщение
Code
1
2
3
4
за tpl.get<0>() - r1.y[1];с единичным размером
за tpl.get<1>() - r1.y[2];с двоичным размером
за tpl.get<2>() - r1.y[3];здесь скрывается троичный размер
за tpl.get<3>() - r1.y[4];здесь скрывается массив размер которого будет 4ре
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
template <typename T, size_t I>
struct AuxList : public AuxList<T, I - 1> 
{
    T data[I];
};
template <typename T>
struct AuxList<T, 1> 
{
    T data[1];
};
 
template <typename T, size_t R>
struct List : private AuxList<T, R>
{
    template <size_t I>
    T (& get() )[I + 1]
    {
        return static_cast<AuxList<T, I + 1>*>(this)->data;
    }
};
 
int main()
{
    List<char, 4> tpl; // 4 - "константа рекурсии"
        
    char (&arr1)[1] = tpl.get<0>(); // "с единичным размером"
    char (&arr2)[2] = tpl.get<1>(); // "с двоичным размером"
    char (&arr3)[3] = tpl.get<2>(); // "здесь скрывается троичный размер"
    char (&arr4)[4] = tpl.get<3>(); // "здесь скрывается массив размер которого будет 4ре"
 
}
Код опубликован как есть. Никакой технической поддержки я не осуществляю, претензии не принимаю, вся терминология взята из поста автора. Также я не несу ответственности за несоответствие ожиданиям автора, за всевозможные "не работает" и т.п.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
01.12.2020, 22:01
Цитата Сообщение от DrOffset Посмотреть сообщение
Код опубликован как есть. Никакой технической поддержки я не осуществляю, претензии не принимаю, вся терминология взята из поста автора. Также я не несу ответственности за несоответствие ожиданиям автора, за всевозможные "не работает" и т.п.
Сохраню.

Буду использовать в качестве официального текста "Вы сами виноваты"-лицензии (OGL - outsource govnokod license)
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
01.12.2020, 22:37  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
char (&arr1)[1] = tpl.get<0>(); // "с единичным размером"
    char (&arr2)[2] = tpl.get<1>(); // "с двоичным размером"
    char (&arr3)[3] = tpl.get<2>(); // "здесь скрывается троичный размер"
    char (&arr4)[4] = tpl.get<3>(); // "здесь скрывается массив размер которого будет 4ре"
ну да специфика такая. Только наоборот. И хотелось бы спрятать это в рекурсию чтобы не писать эти 4 ре строки? Имена arr1 должны быть одинаковыми и должны находится внутри, также arr1 должен быть структурой внутри которого и будет этот массив char.

Добавлено через 7 минут
Цитата Сообщение от JeyCi Посмотреть сообщение
условие выхода из рекурсии по структуре, которую ещё не сделали, - вы продумали?
создаём 4ре структуры и выходим. В Первом примере жесткое привязывание вроде происходит здесь
C++
1
2
3
4
5
template <typename T, typename U, unsigned int I>
class TupleImpl<Typelist<T, U>, I>
    : public TupleElement<T, I>
    , public TupleImpl<U, I + 1>
{ };
А в моём случае я задаю его константой, и ещё условие меняется из-за того что элемент у меня один это структура, а поля его меняются.

Добавлено через 49 секунд
а в первом случае список состоящий из нескольких элементов.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
01.12.2020, 22:52
Nexi99, эти четыре сроки писать не надо. Это демонстрация доступа и все.

Добавлено через 39 секунд
Цитата Сообщение от Nexi99 Посмотреть сообщение
Имена arr1 должны быть одинаковыми и должны находится внутри, также arr1 должен быть структурой внутри которого и будет этот массив char.
C++
1
2
3
4
5
6
7
8
9
10
template <typename T, size_t I>
struct AuxList : public AuxList<T, I - 1> 
{
    T data[I];
};
template <typename T>
struct AuxList<T, 1> 
{
    T data[1];
};
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
02.12.2020, 01:41  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
эти четыре сроки писать не надо. Это демонстрация доступа и все.
т.е можно уже обращаться к tpl.get<>() и т.д. от 0 до 3ёх?
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
02.12.2020, 07:15
Цитата Сообщение от Nexi99 Посмотреть сообщение
т.е можно уже обращаться к tpl.get<>() и т.д. от 0 до 3ёх?
вы хоть читаете коды, которые вам пишут?
- вы же видите, что #49 уже обратился!
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
02.12.2020, 19:41  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
вы хоть читаете коды, которые вам пишут?
- вы же видите, что #49 уже обратился!
Круто пишет человек.
char (&arr1)[1] = tpl.get<0>();
Мне не понятно что происходит с левой половиной а мне то нужна правая её то я и буду использовать. Ну да позже человек написал что обратился. Примеров реализации моей задумки может быть не мало.
Я ещё буду разбираться с этим всем вчера свою методику задумывал, но тоже не доделал голова разболелась.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
03.12.2020, 07:34
Цитата Сообщение от Nexi99 Посмотреть сообщение
Мне не понятно что происходит с левой половиной
вот поэтому и пишу, как вы можете адаптировать код, который не понимаете?.. да и он же вам по линку из #2 советовал сначала разобраться с азами... если хотите сразу сложные коды разбирать - то хотя бы читайте их...
Цитата Сообщение от DrOffset Посмотреть сообщение
C++
1
return static_cast<AuxList<T, I + 1>*>(this)->data;
привёл this к указателю AuxList<T, I + 1>*, взял данные... намешал ваши 2 слова struct List (как вы хотели)...
Цитата Сообщение от DrOffset Посмотреть сообщение
C++
1
struct List : private AuxList<T, R>
а в main'e
Цитата Сообщение от Nexi99 Посмотреть сообщение
char (&arr1)[1]
обозначил тип (азы: ar является указателем, эквивалентным выражению &ar[0] типа char*, т.е. типа "указание переменной типа char", если ar - массив элементов типа char - Важно в С++: принятие имени массива за указатель на 1-й элемент этого массива -- Астахов, Язык С++)...
объявил он это здесь - в main'e
Цитата Сообщение от DrOffset Посмотреть сообщение
C++
1
List<char, 4> tpl // 4 - "константа рекурсии"
;
и дальше вывел ваши массивы (по типу temp, как я вам предлагала, только с заданием реального типа)...
предупредив вас
Цитата Сообщение от DrOffset Посмотреть сообщение
я не несу ответственности за несоответствие ожиданиям автора
- вместо google пояснять вам код не хочется, когда
Цитата Сообщение от Nexi99 Посмотреть сообщение
Мне не понятно что происходит с левой половиной
- а левая половина по сути азы... и так взвращаемся к совету от линка поста #2...
p.p.s.
и к вашей логике... - дело не в том, что круто, а в том, что понятно... главное, что должно быть понятно - ЭТО СТРОЙНАЯ (максимально короткая, простая и универсальная) ЛОГИКА, - когда она есть - вот это будет "круто"... а не мешанина из непонятных вам слов, да ещё на долгосрок не понятно как работающая... чем проще запись и универсальнее её работа - тем она гениальнее и в состоянии пережить года в вашем коде - обычно программисты равняются на это, а не на "круто" ... но вы же равняетесь на "круто" - и закапываетесь на первом же крутом повороте, не сумев справиться с её (записи) управлением... я, например, даже в страшном сне пока не могу и не хочу представлять себе, где такая смесь ваших рюшечек и бантиков может быть короче и работать надёжнее, чем даже если просто
Цитата Сообщение от Zirak Посмотреть сообщение
Не используй кортежи и будет тебе счастье.
для задач такого рода... имхо

Добавлено через 5 минут
(возможно, вы просто не пояснили ваше понимание слова "круто"?)

Добавлено через 10 минут
p.p.p.s
! сложностей в логике быть НЕ должно... их вам хватит в самом проекте, который берёте в разработку...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
03.12.2020, 13:16
Цитата Сообщение от JeyCi Посмотреть сообщение
char (&arr1)[1]
Это не указатель, а ссылка на массив char из одного элемента.
Сам массив находится внутри tpl.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
03.12.2020, 17:13
Цитата Сообщение от DrOffset Посмотреть сообщение
Это не указатель, а ссылка на массив char из одного элемента.
имела ввиду, что условно *a=&a... и указатель из того static_cast (который в шаблоне) задали условно из такого базового равенства уже здесь через &a... ну, может, и ссылка правильнее назвать...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
03.12.2020, 17:24
JeyCi, я понял что вы имели в виду, но указатели применительно к массивам здесь нигде не фигурируют. Если бы я написал так
C++
1
char * parr1 = tpl.get<0>();
то да: было бы то, о чем вы говорите.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
03.12.2020, 17:47
так всё-таки ноги на эту ссылку оттуда выросли, с того static_cast'a?
==
Цитата Сообщение от DrOffset Посмотреть сообщение
AuxList
не про массивы ведь речь, а про этот user-defined АТД
(а указатели и ссылки не только ведь к массивам относятся -- просто на примере массива и с указанием источника примера о массивах - высказала своё видение, конечно, ещё не pro)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.12.2020, 17:47

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
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 Представленная интегрированная схема описывает непрерывную нелинейную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru