Отделить bool/char от остальных integral'ов
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 08.04.25 20:04
Оценка:
Здравствуйте!

Для отделения базовых типов есть is_integral и is_floating_point.

Можно ли как-то так же из интегральных типов выделить bool и char — char хочу отделить от int8_t/uint8_t, которые, скорее всего, определены, как signed/unsigned char, а в плюсах, как мы знаем, signed char, unsigned char и char — это разные типы
Маньяк Робокряк колесит по городу
Re: Отделить bool/char от остальных integral'ов
От: kov_serg Россия  
Дата: 08.04.25 20:47
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>Для отделения базовых типов есть is_integral и is_floating_point.


M>Можно ли как-то так же из интегральных типов выделить bool и char — char хочу отделить от int8_t/uint8_t, которые, скорее всего, определены, как signed/unsigned char, а в плюсах, как мы знаем, signed char, unsigned char и char — это разные типы


Можно, но зачем? https://godbolt.org/z/496ss643o
#include <stdio.h>

int fn(bool) { return 0; }
int fn(char) { return 1; }
int fn(signed char) { return 2; }
int fn(unsigned char) { return 3; }

template<class T>struct Fn;
template<>struct Fn<bool> { enum { value=0 }; };
template<>struct Fn<char> { enum { value=1 }; };
template<>struct Fn<signed char> { enum { value=2 }; };
template<>struct Fn<unsigned char> { enum { value=3 }; };

int main() {
  bool v0; char v1; signed char v2; unsigned char v3;
  printf("v0=%d %d\n",fn(v0),Fn<decltype(v0)>::value);
  printf("v1=%d %d\n",fn(v1),Fn<decltype(v1)>::value);
  printf("v2=%d %d\n",fn(v2),Fn<decltype(v2)>::value);
  printf("v3=%d %d\n",fn(v3),Fn<decltype(v3)>::value);
  return 0;
}
Re: Отделить bool/char от остальных integral'ов
От: Chorkov Россия  
Дата: 09.04.25 10:37
Оценка: 8 (1) +3
Здравствуйте, 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'ов
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.04.25 08:34
Оценка:
Здравствуйте, 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 строк ошибок — фиг ты разберёшься, что там повлияло.
The God is real, unless declared integer.
Отредактировано 10.04.2025 8:39 netch80 . Предыдущая версия .
Re[2]: Тогда и указатели ещё
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.04.25 18:01
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>
C>template<typename T> using is_bool = std::is_same<T, bool>;
C>template<typename T> using is_char = std::is_same<T, char>;
C>


Раз ты такой умный, может ещё подскажешь, как указатели определить?

Отбой, оказывается есть std::is_pointer

Чорт, было так сложно догадаться...
Маньяк Робокряк колесит по городу
Отредактировано 10.04.2025 18:04 Marty . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.