Для отделения базовых типов есть is_integral и is_floating_point.
Можно ли как-то так же из интегральных типов выделить bool и char — char хочу отделить от int8_t/uint8_t, которые, скорее всего, определены, как signed/unsigned char, а в плюсах, как мы знаем, signed char, unsigned char и char — это разные типы
Здравствуйте, Marty, Вы писали:
M>Для отделения базовых типов есть is_integral и is_floating_point.
M>Можно ли как-то так же из интегральных типов выделить bool и char — char хочу отделить от int8_t/uint8_t, которые, скорее всего, определены, как signed/unsigned char, а в плюсах, как мы знаем, signed char, unsigned char и char — это разные типы
Здравствуйте, Marty, Вы писали:
M>Здравствуйте!
M>Для отделения базовых типов есть is_integral и is_floating_point.
M>Можно ли как-то так же из интегральных типов выделить bool и char — char хочу отделить от int8_t/uint8_t, которые, скорее всего, определены, как signed/unsigned char, а в плюсах, как мы знаем, signed char, unsigned char и char — это разные типы
template<typename T> using is_bool = std::is_same<T, bool>;
template<typename T> using is_char = std::is_same<T, char>;
Или использовать is_same/is_same_v по месту, не порождая лишних сущностный...
Re[2]: Отделить bool/char от остальных integral'ов
Здравствуйте, kov_serg, Вы писали:
M>>Можно ли как-то так же из интегральных типов выделить bool и char — char хочу отделить от int8_t/uint8_t, которые, скорее всего, определены, как signed/unsigned char, а в плюсах, как мы знаем, signed char, unsigned char и char — это разные типы _>Можно, но зачем?
Пример 1: проапгрейдили MySQL с 5.6 на 8.0. Был mysql_bool_t (примерно так), который из int стал bool. Был в нашем коде vector<mysql_bool_t>. Из-за хака C++ (vector<bool> это вектор битов) перестал браться указатель на элемент вектора, компиляция сломалась.
Пример 2: шаблонный код, который выводит через iostream значение переменной. Код работал без проблем, пока вызывали для int, long, unsigned int, и так далее. И тут в каком-то варианте был вызов для uint8_t. Тупая тварь C++, ещё из совместимости с C, отрабатывает запись этого типа как unsigned char, вместо значения числа пишется символ, в логе хрень, иногда усечена запись, если число было 0, иногда внеплановый перевод строки, иногда ещё более дикое. (После этого я стал согласен с Виртом, что для char нужны явные chr()/ord(), как бы они ни звались.)
(Да, может, в отдельных случаях есть всякие обходы. Например, можно было бы писать в поток v+0 вместо v. Но это всё частности, и на них задолбёшься всё это в каждом случае писать.)
Вот чтобы такой херни заранее избежать, и нужны подобные проверки. Причём я ещё описывал достаточно простые варианты. Если сложные, если после SFINAE будет 2000 строк ошибок — фиг ты разберёшься, что там повлияло.