Информация об изменениях

Сообщение Re[2]: Как записать такое в современном C++? от 30.06.2023 19:18

Изменено 30.06.2023 19:19 Sm0ke

Re[2]: Как записать такое в современном C++?
Здравствуйте, vopl, Вы писали:


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>
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 , но я его не пробовал.