И все-же - ликбез по C++ времени компиляции
От: Shmj Ниоткуда  
Дата: 08.07.23 04:54
Оценка: :))
Я понял вот какую фишку.

Многие думают что C++ только один. На самом деле их два: обычный C++ и C++ времени компиляции. Совершенно разные языки, но есть кое-что общее.

Вот, к примеру, есть такая функция:

template <int N>
constexpr int factorial() {
    if (N <= 1)
        return 1;
    else
        return N* factorial<N - 1>();
}


Пробую VS последней версии и последний стандарт C++.

Что скажете? Думаете проканает для режима компиляции? А хрена с два — пишет что функция слишком сложная. А вот так уже проканало:

template <int N>
constexpr int factorial() {
    if (N <= 1)
        return 1;
    else
        return 2;
}


Т.е. предкомпилятор довольно ограничен, но не ясно насколько и различается ли он для разных компиляторов (препроцессоров?).

Что интересно, если функция не constexpr — то if/else вообще будут проигноированы. Но как?

Вопрос такой. Есть ли краткая статья, ликбез, где бы рассматривалось зачем все это нужно и как его использовать?
Re: И все-же - ликбез по C++ времени компиляции
От: Нomunculus Россия  
Дата: 08.07.23 05:12
Оценка:
Здравствуйте, Shmj, Вы писали:

А еще третий есть, открой для себя Qt-шный moc
Re: И все-же - ликбез по C++ времени компиляции
От: rg45 СССР  
Дата: 08.07.23 05:22
Оценка: :))
Здравствуйте, Shmj, Вы писали:


S>Вот, к примеру, есть такая функция:


S>
S>template <int N>
S>constexpr int factorial() {
S>    if (N <= 1)
S>        return 1;
S>    else
S>        return N* factorial<N - 1>();
S>}
S>


S> . . .


S>Т.е. предкомпилятор довольно ограничен, но не ясно насколько и различается ли он для разных компиляторов (препроцессоров?).




Где ты здесь предкомпилятор увидел, чудик? Ты Музыченко в репетиторы позвал что ли?
--
Справедливость выше закона. А человечность выше справедливости.
Re: И все-же - ликбез по C++ времени компиляции
От: rg45 СССР  
Дата: 08.07.23 05:31
Оценка: 4 (1) +1
Здравствуйте, Shmj, Вы писали:

S>Многие думают что C++ только один. На самом деле их два: обычный C++ и C++ времени компиляции. Совершенно разные языки, но есть кое-что общее.

S>Т.е. предкомпилятор довольно ограничен, но не ясно насколько и различается ли он для разных компиляторов (препроцессоров?).
S>Что интересно, если функция не constexpr — то if/else вообще будут проигноированы. Но как?

Невежа, прочитай про фазы трансляции и не неси пургу.
--
Справедливость выше закона. А человечность выше справедливости.
Re: И все-же - ликбез по C++ времени компиляции
От: rg45 СССР  
Дата: 08.07.23 06:14
Оценка: 2 (1) +3
Здравствуйте, Shmj, Вы писали:


S>Вот, к примеру, есть такая функция:


S>
S>template <int N>
S>constexpr int factorial() {
S>    if (N <= 1)
S>        return 1;
S>    else
S>        return N* factorial<N - 1>();
S>}
S>


S>Пробую VS последней версии и последний стандарт C++.


S>Что скажете? Думаете проканает для режима компиляции? А хрена с два — пишет что функция слишком сложная. А вот так уже проканало:


Неуч, if constexpr:

template <int N>
constexpr int factorial() {
    if constexpr (N <= 1)
        return 1;
    else
        return N * factorial<N - 1>();
}
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: И все-же - ликбез по C++ времени компиляции
От: Shmj Ниоткуда  
Дата: 08.07.23 06:19
Оценка:
Здравствуйте, rg45, Вы писали:

R>Неуч, if constexpr:


А где бы прочитать про этот второй вид C++ и его особенности. Как он взаимодействует с первым С++?
Re[3]: И все-же - ликбез по C++ времени компиляции
От: rg45 СССР  
Дата: 08.07.23 06:33
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, rg45, Вы писали:


R>>Неуч, if constexpr:


S>А где бы прочитать про этот второй вид C++ и его особенности. Как он взаимодействует с первым С++?


Какой еще ВТОРОЙ ВИД C++?

Просто открываешь справку по if statement и открываешь для себя тот факт, что все эти возможности находятся в ОДНОМ И ТОМ ЖЕ C++
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: И все-же - ликбез по C++ времени компиляции
От: so5team https://stiffstream.com
Дата: 08.07.23 06:37
Оценка: +3
Здравствуйте, Shmj, Вы писали:

S>А где бы прочитать про этот второй вид C++ и его особенности.


Любознательный вы наш, вообще-то люди, которые хотят что-то изучить, либо тратят свое время на штудирование литературы, либо тратят свои деньги на курсы/учителей. Вы же явно хотите выехать на чужом горбу. Фу таким быть.
Re[3]: И все-же - ликбез по C++ времени компиляции
От: rg45 СССР  
Дата: 08.07.23 06:39
Оценка: 1 (1) +1
Здравствуйте, Shmj, Вы писали:

R>>Неуч, if constexpr:


S>А где бы прочитать про этот второй вид C++ и его особенности. Как он взаимодействует с первым С++?


И кстати, количество способов реализовать компайл-тайм факториал в С++ слегка больше одного.

Например, можно через специализацию шаблона функции:

template <size_t N>
constexpr size_t factorial() { return N * factorial<N - 1>(); }

template <>
constexpr size_t factorial<0>() { return 1; }


можно, через fold expressions:

template <size_t...I>
constexpr size_t product(std::index_sequence<I...>) { return (1 * ... * (I + 1)); }

template <size_t N>
constexpr size_t factorial() { return product(std::make_index_sequence<N>{}); }


Можно через шаблон класса и пр.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 08.07.2023 7:01 rg45 . Предыдущая версия .
Re[4]: И все-же - ликбез по C++ времени компиляции
От: Shmj Ниоткуда  
Дата: 08.07.23 07:44
Оценка:
Здравствуйте, rg45, Вы писали:

R>Какой еще ВТОРОЙ ВИД C++?

R>Просто открываешь справку по if statement и открываешь для себя тот факт, что все эти возможности находятся в ОДНОМ И ТОМ ЖЕ C++

По сути это второй вид С++ — компил-тайм С++. Он лишь похож на обычный С++ кое в чем.
Re[5]: И все-же - ликбез по C++ времени компиляции
От: rg45 СССР  
Дата: 08.07.23 07:49
Оценка: :)))
Здравствуйте, Shmj, Вы писали:

S>По сути это второй вид С++ — компил-тайм С++. Он лишь похож на обычный С++ кое в чем.


Интерпретатор ты наш. Удивительно, что вид у тебя всего только второй получился. Я так понимаю, при каждом ударе граблями по лбу количество видов С++ будет увеличиваться.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 08.07.2023 7:49 rg45 . Предыдущая версия .
Re: И все-же - ликбез по C++ времени компиляции
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.07.23 09:18
Оценка: +1 :)
Здравствуйте, Shmj, Вы писали:

S>Многие думают что C++ только один. На самом деле их два: обычный C++ и C++ времени компиляции. Совершенно разные языки, но есть кое-что общее.


Три. Есть еще язык темплейтов. Он тоже Тьюринг-полный, но в отличии от упомянутых тобой двух является чисто функциональным языком с ленивыми вычислениями. Такой, типа Хаскеля, переболевшего оспой и чумой, но выжившего.
Re: И все-же - ликбез по C++ времени компиляции
От: BSOD  
Дата: 08.07.23 10:27
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Вопрос такой. Есть ли краткая статья, ликбез, где бы рассматривалось зачем все это нужно и как его использовать?

Шимж, ты в своем репертуаре.

"Ликбез" в заголовке означает, что внутри будет ликбез или по крайней мере ссылка на него.
Назвал бы "Ищу ликбез" или "Нужен ликбез", в конце концов.

Впрочем, кто успел взглянуть на ник автора темы — никакого ликбеза от него не ждет...
Sine vilitate, sine malitiosa mente
Re[2]: И все-же - ликбез по C++ времени компиляции
От: rg45 СССР  
Дата: 08.07.23 11:07
Оценка:
Здравствуйте, BSOD, Вы писали:

BSO>"Ликбез" в заголовке означает, что внутри будет ликбез или по крайней мере ссылка на него.

BSO>Назвал бы "Ищу ликбез" или "Нужен ликбез", в конце концов.

Причем, вопросы-то у него располагаются в самом конце, под пластами невежественной пурги. Сообщение озаглавлено как "ликбез", ни больше, ни меньше, и начинается словами "Я понял вот какую фишку. Многие думают что C++ только один. На самом деле их два...". Все выглядит так, как-будто он действительно основал теорию относительности, или доказал гипотезу Пуанкаре, и теперь хочет озарить светом нашу дремучесть.
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: И все-же - ликбез по C++ времени компиляции
От: Shmj Ниоткуда  
Дата: 08.07.23 11:16
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Три. Есть еще язык темплейтов. Он тоже Тьюринг-полный, но в отличии от упомянутых тобой двух является чисто функциональным языком с ленивыми вычислениями. Такой, типа Хаскеля, переболевшего оспой и чумой, но выжившего.


Стоп. Так темплейты ж эти — они как раз в момент компиляции и разворачиваются.
Re[4]: И все-же - ликбез по C++ времени компиляции
От: Shmj Ниоткуда  
Дата: 08.07.23 11:19
Оценка: :)
Здравствуйте, so5team, Вы писали:

S>Любознательный вы наш, вообще-то люди, которые хотят что-то изучить, либо тратят свое время на штудирование литературы, либо тратят свои деньги на курсы/учителей. Вы же явно хотите выехать на чужом горбу. Фу таким быть.


Посмотрите на эти курсы — там такие вопросы не затрагиваются. Все поверхностно.
Re[3]: И все-же - ликбез по C++ времени компиляции
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.07.23 16:32
Оценка:
Здравствуйте, Shmj, Вы писали:

Pzz>>Три. Есть еще язык темплейтов. Он тоже Тьюринг-полный, но в отличии от упомянутых тобой двух является чисто функциональным языком с ленивыми вычислениями. Такой, типа Хаскеля, переболевшего оспой и чумой, но выжившего.


S>Стоп. Так темплейты ж эти — они как раз в момент компиляции и разворачиваются.


Но только темплейты — это одно, а констелспры — это другое.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.