Интегральные типы

129
02 июля 2019, 08:00

Почему конструкция switch case работает только с интегральными типами, и что вообще такое интегральные типы?

Answer 1

Термин "integral" ("интегральный") является синонимом термина "integer" ("целочисленный"). Так что интегральные типы - это просто все целочисленные типы.

Конструкция switch/case работает только с целочисленными типами потому, что, во-первых, ей нужен тип с четко и однозначно определенным отношением строгого равенства, что, например, исключает использование плавающих типов. В этом отношении switch/case аналогичен нетиповым шаблонным параметрам, которые тоже поддерживают только типы с четко определенным отношением равенства.

Во-вторых, эта конструкция изначально задумывалась не просто как "синтаксический сахар", а с задней мыслью о том, что во многих случаях структура переходов в switch/case будет поддаваться очевидным оптимизациям: табличной реализации или реализации через прямое вычисление целевого адреса. Для "сложных" типов, вроде строк, возникновение возможности такой оптимизации выглядит существенно менее вероятным, чем для целочисленных типов.

Разумеется, в современном С++ не составило бы, наверное, большого труда расширить диапазон поддерживаемых в switch/case типов. Но, насколько я знаю, таких планов пока нет.

Answer 2

Сначала представим как работает эта конструкция. Не точно, но логика такая:

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 << "....";

Поэтому было введено ограничение...

READ ALSO
Отправка рабочего стола через TCP (boost + opencv)

Отправка рабочего стола через TCP (boost + opencv)

Всех приветствуюНаткнулся на пример отправки изображения камеры с клиента на сервер, решил попробовать отослать изображение рабочего стола...

160
Метод прогонки/Алгоритм Томаса(С++) [закрыт]

Метод прогонки/Алгоритм Томаса(С++) [закрыт]

Здраствуйте! Хотел бы попросить Вас о маленькой помощиПроблема заключается в следующем : должен найти решения матрицы методом прогонки и в конечном...

134
как убрать кавычки

как убрать кавычки

Допустим нужно ввести строку Например : ((1&1)^(0|1)) Чтобы он вывел : 0 нужно превратить это "((1&1)^(0|1))" в это ((1&1)^(0|1))

132
Допустим ли вызов деструктора в данной ситуации?

Допустим ли вызов деструктора в данной ситуации?

Пишу класс двусвязного списка, и у меня появилась необходимость перегрузить operator=Кусок класса

141