Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Создать свой числовой тип с допустимыми значениями

#cpp #delphi


На делфи я могу написать:

type
  TExample = -1..High(Word)-1;


Можно ли сделать что-то подобное в C++?
Если можно, то как?

// псевдокод
typedef int[-1..65534] TExample;

    


Ответы

Ответ 1



Ну если таки вам нужен велосипед, то ловите - думаю вы сами допишете нужный вам функционал: #include class 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, от которого требовалась строгость, а не скорость. Во-вторых, это язык для десктопных бизнес-приложений, где, теоретически, надежность важнее скорости.

Комментариев нет:

Отправить комментарий