Re[27]: Как записать такое в современном C++?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 02.08.24 18:37
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Везде придётся писать decltype


Сколько примерно будет этого "везде"? Если много, то имеет смысл сделать сокращение. Но мне почему-то кажется, что decltype, вместе с адекватными операциями над типами, будет компактнее, чем многие нынешние "решения".

BFE>Какая конструкция переведёт T.type_name обратно в тип?


Понятное дело, нужна полная система операций над всеми сущностями, известными во время компиляции (типами, классами, переменными, функциями и прочим).
Re: Как записать такое в современном C++?
От: Умака Кумакаки Ниоткуда  
Дата: 12.08.24 00:35
Оценка: 15 (1)
Здравствуйте, Alekzander, Вы писали:

A>Как это записать в современном C++, чтобы не было performance penalty? Без конструирования контейнера и т.п. Нормальных макросов же (как в Немерле), насколько я понимаю, не завезли?


в с++23 можно так:

if (std::ranges::contains(std::array{
  EAGAIN,
  EWOULDBLOCK,
  EINTR,
  ENOSPC,
  ENOBUFS,
  ENOMEM
}, errno)) {
  // 
};
нормально делай — нормально будет
Отредактировано 12.08.2024 0:38 Умака Кумакаки . Предыдущая версия .
Re[4]: Как записать такое в современном C++?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 07.09.24 11:56
Оценка:
Здравствуйте, Pzz, Вы писали:

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


N>>Тут есть одна проблемка: на большинстве систем коды EAGAIN и EWOULDBLOCK сейчас совпадают (такое вот легаси), но есть специфические, где они различны. При совпадении switch выдаёт ошибку.


Pzz>А на BSD совпадает?


Все BSD не смотрел. На фряхе совпадает.
The God is real, unless declared integer.
Re[3]: Как записать такое в современном C++?
От: vdimas Россия  
Дата: 19.11.24 04:11
Оценка:
Здравствуйте, Alekzander, Вы писали:

Pzz>>
Pzz>>    if (errno == EAGAIN) {
Pzz>>        errno = EWOULDBLOCK;
Pzz>>    }
Pzz>>

A>Это будет трудноватенько обобщить. (Может, и к лучшему).

А для какой платформы?
На линухах, BSD и макоси это один и тот же код.
Для виндов есть только WSAEWOULDBLOCK, без WSAEAGAIN.

Если речь про сокеты, то исторически для записи чаще было EWOULDBLOCK (кроме неблокирующего connect, где ожидается готовность по записи), а для чтения EAGAIN (в т.ч. для неблокирующего accept), потом эти константы в POSIX допустили объединить.

Вдогонку, таблица кодов ошибок для различных систем:
https://www.ioplex.com/~miallen/errcmp.html

Трудновато там будет обобщить другое — код ошибки в случае неудачного connect, бо его надо добывать по-разному в разных системах.
А для семантики работы с сокетом лучше просто сравнить и с EWOULDBLOCK и с EAGAIN, т.к. компилятор лишнее сравнение выкинет, если коды одинаковые.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.