#cpp #delphi
На делфи я могу написать: type TExample = -1..High(Word)-1; Можно ли сделать что-то подобное в C++? Если можно, то как? // псевдокод typedef int[-1..65534] TExample;
Ответы
Ответ 1
Ну если таки вам нужен велосипед, то ловите - думаю вы сами допишете нужный вам функционал: #includeclass MyShort { public: static const int MAX_EL {65534}; static const int MIN_EL {-1}; private: int number_; public: MyShort () { }; MyShort (int num) { if (num <= MAX_EL && num >= MIN_EL) { number_ = num; } else { number_ = -1; } }; ~MyShort() { }; MyShort &operator=(MyShort &a) { number_ = a.number_; return *this; }; MyShort &operator=(int num) { if (num <= MAX_EL && num >= MIN_EL) { number_ = num; } else { number_ =-1; } return *this; }; }; int main(int argc, char *argv[]) { MyShort alfa {}; alfa = 5; alfa = -1; return 0; } Но опять таки повторюсь: это лишено всякого смысла!!! Так как в памяти нет никакого разделения, это вопрос простой интерпретации: так -1 и 65535 - в памяти это абсолютно одинаковые последовательности бит (для 2-байтного типа). Так например: unsigned short alfa = -1; unsigned short beta = 65535; if (alfa == beta) { std::cout << "Comp" << std::endl; } Будет выводит на экран сообщения (при этом если вы смените только на одном из чисел тип, то при сравнении они будут приведены к int и числа уже не будут одинаковы, так как это уже будут не 2-х байтные числа). Ответ 2
Можно попробовать ещё так: __extension__ typedef enum __attribute__ ((__packed__)) { ES = 500, EE } mytype_t; printf( "size: %zu\n", sizeof(mytype_t)); При такой схеме компилятор использует наименьший тип, который будет содержать все значения. Размер должен быть 2, по логике, и будет инкременироваться на 1 при каждом увеличении += 256. Есть ещё опция -fshort-enums у GCC,clang это приводит тип enum к состоянию типа signed short.. Это конечно не готовое решение, но направление к размышлению, как это можно организовать с помощью расширений компилятора.Ответ 3
Встречный вопрос автору: а чего вы хотите добиться? Если генерации рантайм-проверок на выход из диапазона, то вы ошиблись языком. С++ наоборот избавляется в рантайме от всего, от чего можно избавиться. Нужна проверка - создайте собственный класс и перегружайте оператор присваивания. Если хотите запихнуть этот диапазон в два байта и использовать -1 как сигнальное состояние, то вполне можете использовать как сигнальное состояние значение 65535, засунув его в константу. Если при этом оно должно быть меньше 0, то опять же класс и перегрузка операторов. Delphi имеет другую специфику применения. Это, во-первых, наследник учебного языка Pascal, от которого требовалась строгость, а не скорость. Во-вторых, это язык для десктопных бизнес-приложений, где, теоретически, надежность важнее скорости.
Комментариев нет:
Отправить комментарий