Conversation
В контексте примера было не понятно, что такое ADL, дополнил пример
Добавил заметку про Fold expressions
|
Я добавил заметку про Fold Expression, если она имеет место быть, я хотел бы получить картинку с практики, где показывали графики с использовался fold exp и нет, чтобы вставить её в конце для наглядности |
|
Также сделал несколько грамматических исправлений (grammar). И немного изменил пример на странице 16_namespaces_using_adl |
Почистил заметку
Из-за того, что функции объявлены в одном порядке, а используются в другом возникает путаница, что из них считать первым вариантом. Решил чётко разграничить
src/10_libraries.md
Outdated
| } | ||
| ``` | ||
| ```c++ | ||
| // five |
src/16_namespaces_using_adl.md
Outdated
| ```c++ | ||
| namespace my_lib { | ||
| struct big_integer {}; | ||
| void swap(big_integer&, big_integer&) {// ... //} |
There was a problem hiding this comment.
таких комментариев в языке нет, лучше /* и */
src/20_perfect_forwarding.md
Outdated
|
|
||
| В **C++17** появилась фича **Fold Expressions**, позволяющая сделать свёртку по элементам пака относительно бинарного оператора. | ||
|
|
||
| Мотивирующий пример: попробуем научиться проверять, есть ли тип (T) в паке. Так как пак в C++ имеет вид lazy array (То есть мы имеем право получить только Head и Tail), очевидна следующая реализация: |
There was a problem hiding this comment.
имена типов и других идентификаторов лучше заключать в `
src/20_perfect_forwarding.md
Outdated
|
|
||
| В **C++17** появилась фича **Fold Expressions**, позволяющая сделать свёртку по элементам пака относительно бинарного оператора. | ||
|
|
||
| Мотивирующий пример: попробуем научиться проверять, есть ли тип (T) в паке. Так как пак в C++ имеет вид lazy array (То есть мы имеем право получить только Head и Tail), очевидна следующая реализация: |
There was a problem hiding this comment.
часть предложения в скобках не должна начинаться с большой буквы
There was a problem hiding this comment.
Не знаю, является ли "C++26", но если является напишите
src/20_perfect_forwarding.md
Outdated
|
|
||
| В **C++17** появилась фича **Fold Expressions**, позволяющая сделать свёртку по элементам пака относительно бинарного оператора. | ||
|
|
||
| Мотивирующий пример: попробуем научиться проверять, есть ли тип (T) в паке. Так как пак в C++ имеет вид lazy array (То есть мы имеем право получить только Head и Tail), очевидна следующая реализация: |
There was a problem hiding this comment.
"lazy array" это какой-то распространённый в таком контексте термин? я впервые слышу
давай или ссылку, где он применяется, либо не будем его упоминать
There was a problem hiding this comment.
ну здесь имеется в виду lazy sequence, но я лучше это просто уберу
src/20_perfect_forwarding.md
Outdated
| }; | ||
| ``` | ||
|
|
||
| Чем плоха такая реализация? Предположим в паке N элементов, тогда компилятор будет проводить N инстансов шаблона `have_type`. Как можно это пофиксить? Вспомним, что `...` ставится там, где перечисляются элементы. В Fold expressions это и используется. Тогда предыдущий пример можно переписать так: |
src/20_perfect_forwarding.md
Outdated
| В **C++17** появилась фича **Fold Expressions**, позволяющая сделать свёртку по элементам пака относительно бинарного оператора. | ||
|
|
||
| Мотивирующий пример: попробуем научиться проверять, есть ли тип (T) в паке. Так как пак в C++ имеет вид lazy array (То есть мы имеем право получить только Head и Tail), очевидна следующая реализация: |
There was a problem hiding this comment.
перед сложным примером, уходящим в сторону метапрограммирования, полезно показать какой-нибудь более простой и типичный пример свёртки
src/20_perfect_forwarding.md
Outdated
|
|
||
| template <typename Type, typename... Types> | ||
| struct have_type<Type, Types...> { | ||
| static constexpr bool value = std::is_same_v<Type, Types> || ...; |
There was a problem hiding this comment.
это не скомпилируется по нескольким причинам
src/20_perfect_forwarding.md
Outdated
|
|
||
| Чем это хорошо? | ||
| - Нет рекурсии. | ||
| - Быстрее compile time, потому что меньше инстансов и у компилятора есть возможность делать оптимизации. |
There was a problem hiding this comment.
английский ну совсем на ровном месте, давай заменим на "время компиляции"
src/20_perfect_forwarding.md
Outdated
|
|
||
| Чем это хорошо? | ||
| - Нет рекурсии. | ||
| - Быстрее compile time, потому что меньше инстансов и у компилятора есть возможность делать оптимизации. |
There was a problem hiding this comment.
не совсем понял, о каких оптимизациях речь
There was a problem hiding this comment.
Я здесь немного ошибся с примером в метапрограммировании (хотя здесь тоже должны быть оптимизации, потому что проиходит свёртка булов). Здесь всё-таки имеются в виду вообще оптимизации fold-ов, даже вне метапроги. Насчёт оптимизаций: я вообще думал, что компилятор умеет делать что-то типо свёртки констант в компайл тайме (Например свернуть sum(1, 2, 3, 4) в return 10), но почему-то когда я начал это на godbolt писать, то оно не воспроизвелось. Есть оптимизация булов https://godbolt.org/z/nbKcof5qf вот тут видно, что компилятор может соптимизировать вывод false после первого встреченного false, конечно он делает нечто подобное и в случае когда вызывается функция two, но он её не инлайнит, поэтому может быть больше джампов по программе например. Да и пример может быть сложнее. +у компилятора есть пространство для векторизации(то есть, допустим сложить несколько чиселок за 1 инструкцию). В общем случае, всё, что сказано выше заключено во фразе "Нет рекурсии", но я считаю важным написать про оптимизации
There was a problem hiding this comment.
Я засомневался, что пример с оптимизацией булов действительно подходит, поэтому вот пример когда работает constant folding с делением https://godbolt.org/z/MYqYcnzG6 (с -O2)
No description provided.