Сообщение Re[2]: Как записать такое в современном C++? от 30.06.2023 19:18
Изменено 30.06.2023 19:19 Sm0ke
Re[2]: Как записать такое в современном C++?
Здравствуйте, vopl, Вы писали:
A>>А чтобы, значит, таких ошибок не допускать, он предлагал форматирование.
A>>
A>>С моей точки зрения это глупость.
V>да нормальный это подход, ничего в нем глупого нет. Табличное форматирование хорошо помогает видеть нарушения структурности, если его использовать побольше
A>>Код надо писать так, чтобы его нельзя было записать неправильно хоть в строчку, хоть столбиком, табличкой, крестиком, козликом и т.д. Соответственно, единственный правильный вариант это вот такой вот псевдокод:
A>>
A>>Как это записать в современном C++, чтобы не было performance penalty? Без конструирования контейнера и т.п. Нормальных макросов же (как в Немерле), насколько я понимаю, не завезли?
V>например
V>
Вот бы уменьшить число сравнений с помощью бинарного поиска в упорядоченном ряде значений.
Взять какой-нибудь constexpr set и вызвать метод contains().
Есть например https://github.com/serge-sans-paille/frozen , но я его не пробовал.
A>>А чтобы, значит, таких ошибок не допускать, он предлагал форматирование.
A>>
A>>if (!( errno == EAGAIN
A>> || EWOULDBLOCK
A>> || errno == EINTR
A>> || errno == ENOSPC
A>> || errno == ENOBUFS
A>> || errno == ENOMEM)) {
A>>
A>>С моей точки зрения это глупость.
V>да нормальный это подход, ничего в нем глупого нет. Табличное форматирование хорошо помогает видеть нарушения структурности, если его использовать побольше
A>>Код надо писать так, чтобы его нельзя было записать неправильно хоть в строчку, хоть столбиком, табличкой, крестиком, козликом и т.д. Соответственно, единственный правильный вариант это вот такой вот псевдокод:
A>>
A>>if (!(errno is in (
A>> EAGAIN,
A>> EWOULDBLOCK,
A>> EINTR,
A>> ENOSPC,
A>> ENOBUFS,
A>> ENOMEM
A>> ))
A>>{
A>>...
A>>}
A>>
A>>Как это записать в современном C++, чтобы не было performance penalty? Без конструирования контейнера и т.п. Нормальных макросов же (как в Немерле), насколько я понимаю, не завезли?
V>например
V>
V>#include <errno.h>
V>template <auto... set>
V>bool isin(auto val)
V>{
V> return (false || ... || (set == val));
V>}
V>int main()
V>{
V> //
V> if(isin<EAGAIN,
V> EWOULDBLOCK,
V> EINTR,
V> ENOSPC,
V> ENOBUFS,
V> ENOMEM>(errno))
V> {
V> return 0;
V> }
V> return 1;
V>}
V>
Вот бы уменьшить число сравнений с помощью бинарного поиска в упорядоченном ряде значений.
Взять какой-нибудь constexpr set и вызвать метод contains().
Есть например https://github.com/serge-sans-paille/frozen , но я его не пробовал.
Re[2]: Как записать такое в современном C++?
Здравствуйте, vopl, Вы писали:
V>например
V>
Вот бы уменьшить число сравнений с помощью бинарного поиска в упорядоченном ряде значений.
Взять какой-нибудь constexpr set и вызвать метод contains().
Есть например https://github.com/serge-sans-paille/frozen , но я его не пробовал.
V>например
V>
V>#include <errno.h>
V>template <auto... set>
V>bool isin(auto val)
V>{
V> return (false || ... || (set == val));
V>}
V>int main()
V>{
V> //
V> if(isin<EAGAIN,
V> EWOULDBLOCK,
V> EINTR,
V> ENOSPC,
V> ENOBUFS,
V> ENOMEM>(errno))
V> {
V> return 0;
V> }
V> return 1;
V>}
V>
Вот бы уменьшить число сравнений с помощью бинарного поиска в упорядоченном ряде значений.
Взять какой-нибудь constexpr set и вызвать метод contains().
Есть например https://github.com/serge-sans-paille/frozen , но я его не пробовал.