Почему конструкция switch case работает только с интегральными типами, и что вообще такое интегральные типы?
Термин "integral" ("интегральный") является синонимом термина "integer" ("целочисленный"). Так что интегральные типы - это просто все целочисленные типы.
Конструкция switch/case
работает только с целочисленными типами потому, что, во-первых, ей нужен тип с четко и однозначно определенным отношением строгого равенства, что, например, исключает использование плавающих типов. В этом отношении switch/case
аналогичен нетиповым шаблонным параметрам, которые тоже поддерживают только типы с четко определенным отношением равенства.
Во-вторых, эта конструкция изначально задумывалась не просто как "синтаксический сахар", а с задней мыслью о том, что во многих случаях структура переходов в switch/case
будет поддаваться очевидным оптимизациям: табличной реализации или реализации через прямое вычисление целевого адреса. Для "сложных" типов, вроде строк, возникновение возможности такой оптимизации выглядит существенно менее вероятным, чем для целочисленных типов.
Разумеется, в современном С++ не составило бы, наверное, большого труда расширить диапазон поддерживаемых в switch/case
типов. Но, насколько я знаю, таких планов пока нет.
Сначала представим как работает эта конструкция. Не точно, но логика такая:
int val[] = {3, 4, 7}, Cswitch_case =4;
for (int i = 0; i < 3; ++i) {
if (!(val[i] ^ Cswitch_case)) // так проверяет switch
cout << i;
Т.е. выполняется битовая операция, результат которого дает команду по какой метке выполнять программу. (правда, еще проверку, что оба нули, я не дописал).
А для неинтегральных типов, обычно это невозможно. Например: }
string s1("first"), s2 = s1;
// if(!(s1 ^ s2)) эта битовая операция невозможна
// cout << "....";
Поэтому было введено ограничение...
Виртуальный выделенный сервер (VDS) становится отличным выбором
Всех приветствуюНаткнулся на пример отправки изображения камеры с клиента на сервер, решил попробовать отослать изображение рабочего стола...
Здраствуйте! Хотел бы попросить Вас о маленькой помощиПроблема заключается в следующем : должен найти решения матрицы методом прогонки и в конечном...
Допустим нужно ввести строку Например : ((1&1)^(0|1)) Чтобы он вывел : 0 нужно превратить это "((1&1)^(0|1))" в это ((1&1)^(0|1))
Пишу класс двусвязного списка, и у меня появилась необходимость перегрузить operator=Кусок класса