Ghost2
> Но строгие тайпдефы будут гораздо более элегантным решением на С++.
на самом деле ты это можешь и сейчас реализовать спокойно обернув все необходимые базовые типы в шаблонную структуру в которой реализуешь необходимые запреты. И для всех нужных типов:
using s_int = strong_type<int>; using s_bool = strong_type<bool>;
и т.д.
только это тебя не защитит от случая когда будут одинаковые типы абсолютно, поэтому named arguments даёт более высокий уровень защиты от ошибки по не внимательности.
Aroch
> только это тебя не защитит от случая когда будут одинаковые типы абсолютно
Так смысл строгих тайпдефов именно в том, чтобы
using money = int class; using range = int class;
Друг к другу не приводились неявно, но обеспечивали функциональность int в выражениях.
Ghost2
> Так смысл строгих тайпдефов именно в том, чтобы
сейчас также можно:
using money = strong_type<int, "money">; using range = strong_type<int, "range">;
Aroch
> сейчас также можно
Да можно, можно. Есть https://github.com/foonathan/type_safe и аналоги, я же говорил.
Ghost2
> Да можно, можно. Есть https://github.com/foonathan/type_safe и аналоги, я же говорил.
выглядит слишком переусложненным. Для базовых типов всё делается гораздо проще.
Aroch
> выглядит слишком переусложненным
По сравнению с int class конечно.
Ghost2
> По сравнению с int class конечно.
если требуется всего лишь добавить легковесный заголовок и написать strong_type<int, "new_type">; то int class не стоит того чтобы ждать пока каким то чудом он появится в языке вместо того чтобы воспользоваться собственным решением.
Как достали подобные ошибки компиляции из стандартных библиотек. Когда часто собираешь софт - это норма, сразу найдёшь где косяк, т.к. поменял не много, а если долго не собирал, написал тонну кода, то хрен знает даже где потом искать, т.к. подобные ошибки никак не указывают на именно твою строчку в коде, а то, что у него чего-то там внутри не удалось проинициализировать, мне вообще должно быть до лампочки...
1>C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.40.33807\include\xutility(374,54): error C2440: 'initializing': cannot convert from 'initializer list' to '_Ty'
1>C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.40.33807\include\xutility(374,54): error C2440: with
1>C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.40.33807\include\xutility(374,54): error C2440: [
1>C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.40.33807\include\xutility(374,54): error C2440: _Ty=unsigned int
1>C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.40.33807\include\xutility(374,54): error C2440: ]
upd: в данном случае это была расплата за emplace_back. Я поменял структуру вектора, а в emplace_back в одном месте добавлялся лишний параметр.
THE_MASTER
Мне тут сказали что нужен конкретный пример иначе пошлют или туда или сюда...
нашел в старом коде.
#define ABS(X) ( ( ( X) > 0) ? ( X) : ( -X))
kipar
Неправильный ответ, правильный — это функция.
Имбирная Ведьмочка
и правда, в С11 же _Generic запилили, надо бы попробовать.
kipar
А чего не цпп, любите пострадать?
kipar
[[gnu::pure]] int foo (int x ) { if ( x > 0) return x; return -x; }
а какое битовое представление у -0?
никогда не задумывался
а, это во float два нуля, тогда лучше без бранчинга
https://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs