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

225
31 августа 2018, 17:30

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

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

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

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

Ну если таки вам нужен велосипед, то ловите - думаю вы сами допишете нужный вам функционал:

#include<iostream>
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-х байтные числа).

Answer 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..

Это конечно не готовое решение, но направление к размышлению, как это можно организовать с помощью расширений компилятора.

Answer 3

Встречный вопрос автору: а чего вы хотите добиться?

Если генерации рантайм-проверок на выход из диапазона, то вы ошиблись языком. С++ наоборот избавляется в рантайме от всего, от чего можно избавиться. Нужна проверка - создайте собственный класс и перегружайте оператор присваивания.

Если хотите запихнуть этот диапазон в два байта и использовать -1 как сигнальное состояние, то вполне можете использовать как сигнальное состояние значение 65535, засунув его в константу. Если при этом оно должно быть меньше 0, то опять же класс и перегрузка операторов.

Delphi имеет другую специфику применения. Это, во-первых, наследник учебного языка Pascal, от которого требовалась строгость, а не скорость. Во-вторых, это язык для десктопных бизнес-приложений, где, теоретически, надежность важнее скорости.

READ ALSO
Поворачивание Perspective Camera

Поворачивание Perspective Camera

Как поворачивать Perspective Camera, когда по экрану проводят пальцем (как в Майнкрафте Bedrock Edition)?

196
Vaadin 8. Компонент Upload. Нужно ли закрывать OutputStream?

Vaadin 8. Компонент Upload. Нужно ли закрывать OutputStream?

Код взят для примера с офф сайта ваадина:

200
Анимировать View с помощью two-way data DataBinding

Анимировать View с помощью two-way data DataBinding

Я использую паттерн MVVM В XML у меня есть View, которое нужно анимировать в зависимости от изменения ViewModel Есть ли у кого-нибудь примеры? PS С изменением...

184