Re: Как записать такое в современном C++?
От: vopl Россия  
Дата: 17.06.23 05:31
Оценка: 124 (7) +5
A>А чтобы, значит, таких ошибок не допускать, он предлагал форматирование.

A>
A>if (!(   errno == EAGAIN
A>      || EWOULDBLOCK
A>      || errno == EINTR
A>      || errno == ENOSPC
A>      || errno == ENOBUFS
A>      || errno == ENOMEM)) {
A>


A>С моей точки зрения это глупость.


да нормальный это подход, ничего в нем глупого нет. Табличное форматирование хорошо помогает видеть нарушения структурности, если его использовать побольше

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? Без конструирования контейнера и т.п. Нормальных макросов же (как в Немерле), насколько я понимаю, не завезли?


например

#include <errno.h>

template <auto... set>
bool isin(auto val)
{
    return (false || ... || (set == val));
}

int main() 
{
    // 
    if(isin<EAGAIN,
            EWOULDBLOCK,
            EINTR,
            ENOSPC,
            ENOBUFS,
            ENOMEM>(errno))
    {
        return 0;
    }

    return 1;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.