Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2020, 09:47   #31
Loksiin12
Форумчанин
 
Регистрация: 04.10.2020
Сообщений: 136
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Loksiin12, не обязательно нужно именно студию. Поставь QtCreator, с ним идёт компилятор, который поддерживает C++17
А если просто попробовать погонять код, то есть онлайн компиляторы (легко ищутся)
Мне нравится Студия тем что там подсветка строк скобок есть а я свои коды пишу плотно ну типа меньше текста и больше пользы, чтобы посмотреть и увидеть что действительно что-то делает. Значит MakeList отвечает за комплектацию типов но полноценной сборки наверное ещё нет.
Код:
template <class TList> struct Length;

template <>
struct Length< NullType >
{
    enum { value = 0 };//
};
здесь наверное объявляется value он хранит размер

Код:
template <class T, class U>
struct Length< Typelist<T, U> >
{
    enum { value = 1 + Length<U>::value };
};
Typelist<Tвыступает как начало списка, Uпроходит его>. Просто удивительно что программа на такое способна.
Loksiin12 вне форума Ответить с цитированием
Старый 27.10.2020, 09:56   #32
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

Loksiin12, подсветка сейчас везде есть. А плотно писать не нужно, писать нужно читаемо. Чтобы даже без всякой подсветки читалось

объявление шаблона Length (тела шаблона ещё нет)
Код:
template <class TList> struct Length;
специализация шаблона Length для случая, когда параметр является типом NullType
Код:
template <>
struct Length< NullType >
{
    enum { value = 0 };//это не переменная, это константа
};
специализация шаблона Length для случая, когда параметр является типом Typelist<T, U> (где T и U - заранее неизвестные типы)
Код:
template <class T, class U>
struct Length< Typelist<T, U> >
{
    enum { value = 1 + Length<U>::value };//константа формируется как сумма всех констант из рекурсивно инстанцированных шаблонов Length
};

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
Просто удивительно что программа на такое способна.
это всё выполняется на этапе компилирования - выведение констант, типов и инстанцирование шаблонов

после всех подстановок получается вполне себе обычный код на C++, который компилятор дальше собирает "как обычно"
Алексей1153 на форуме Ответить с цитированием
Старый 27.10.2020, 10:57   #33
Loksiin12
Форумчанин
 
Регистрация: 04.10.2020
Сообщений: 136
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Length
Эта структура узнаёт про список ниже, потому что если я правильно вижу код структура ещё не знает сколько там элементов и какие они?
Loksiin12 вне форума Ответить с цитированием
Старый 27.10.2020, 11:02   #34
Loksiin12
Форумчанин
 
Регистрация: 04.10.2020
Сообщений: 136
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
enum { value = 0 };//это не переменная, это константа
она имеет тип enum список перечисления.
Loksiin12 вне форума Ответить с цитированием
Старый 27.10.2020, 11:18   #35
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
Эта структура узнаёт
это ШАБЛОН , он заранее не знает, какой тип подставят в параметры. Это становится известно тогда, когда шаблон используют (инстанцируют)

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
она имеет тип enum список перечисления.
это константа. В данном случае - константа типа int
Алексей1153 на форуме Ответить с цитированием
Старый 27.10.2020, 11:38   #36
Loksiin12
Форумчанин
 
Регистрация: 04.10.2020
Сообщений: 136
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Length
Эта структура узнаёт про список ниже?
Loksiin12 вне форума Ответить с цитированием
Старый 27.10.2020, 12:03   #37
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

если попытаться вот так использовать шаблон
Код:
Length<Typelist<int,char>> /*var*/;
то произойдёт объявление таких структур
Цитата:
struct Length<char>;//нет тела структуры - ошибка компиляции

struct Length< Typelist<int, char> >
{
enum { value = 1 + Length<char>::value };//ошибка компиляции
};
понятно, почему так?
Алексей1153 на форуме Ответить с цитированием
Старый 27.10.2020, 12:42   #38
Loksiin12
Форумчанин
 
Регистрация: 04.10.2020
Сообщений: 136
По умолчанию

извиняюсь не так написал
Loksiin12 вне форума Ответить с цитированием
Старый 27.10.2020, 12:48   #39
Loksiin12
Форумчанин
 
Регистрация: 04.10.2020
Сообщений: 136
По умолчанию

а извинясь есть
Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
enum { value = 1 + Length<U>::value };
Почему здесь крутится U а не Т?
Loksiin12 вне форума Ответить с цитированием
Старый 27.10.2020, 12:53   #40
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

Loksiin12, здесь ничего не крутится. Здесь T - головной тип, U - хвост (все последующие типы из списка. Но этот список - он не явно задан, а имитируется при помощи Typelist)
Алексей1153 на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разобраться с кодом Boris2 Помощь студентам 1 15.07.2013 15:58
С++ разобраться с кодом marina12 Помощь студентам 2 21.05.2013 23:22
разобраться с кодом iris_ka Помощь студентам 0 16.05.2012 17:19
Разобраться с кодом. Vlero PHP 2 20.01.2011 12:46
проблемка с кодом, результат получается немного не такой как надо hen Помощь студентам 3 24.04.2009 15:11