Каков наилучший способ для непоследовательных целых чисел C++

Следуя шаблону перечисления C++, который я уже описал здесь, я пытался сделать подобное, но на этот раз последовательность значений, которую я хочу использовать, не состоит из непрерывных целых чисел.

Код явно неправильный:

class Rotations
{
    enum PossibleIndexes
    {
        ZERO,
        PLUS180,
        PLUS90,
        MINUS90
    };


    enum PossibleValues
    {
        ZERO= 0,
        PLUS180= 180,
        PLUS90= 90,
        MINUS90= -90
    };

    static int Count() { return MINUS90 + 1; }

    static PossibleValues Default(){ return ZERO; }
};

поскольку будут конфликты между элементами, присущими двум перечислениям.

Итак, мой вопрос: каков наилучший подход для реализации фиксированного числа жестко закодированных вращений {0, 180, 90, -90}, которые также имеют функции по умолчанию и счетчик?

3 ответа

Решение

Из-за ограничений Visual C++ 2010 Compilation Toolkit (не полностью совместимого с C++11), мне пришлось отказаться от низших подходов.

Сообщение на /questions/4442317/initsializatsiya-staticheskogo-massiva-konstant-v-zagolovochnom-fajle/4442335#4442335 также предложило мне интересный подход для получения значений.

class Rotations
{
public:
    typedef enum
    {
        ZERO= 0,
        PLUS180= 180,
        PLUS90 = 90,
        MINUS90 = -90
    }PossibleValues;

    static const PossibleValues PossibleValuesCollection(int index) {
        static const PossibleValues values[] = { ZERO, PLUS180, PLUS90, MINUS90 };

        return values[index];
    }

    static int Count() { return 4; }
    static PossibleValues Default(){ return ZERO; }
};

Вы всегда можете сохранить статический список std::initializer_list, содержащий все возможные значения

namespace PossibleValues
{
    enum Type
    {
        ZERO= 0,
        PLUS180= 180,
        PLUS90= 90,
        MINUS90= -90
    };

    constexpr auto Values = {ZERO, PLUS180, PLUS90, MINUS90};
    size_t Count() { return Values.size(); }
    Type Default() { return *begin(Values); }
}

Этот подход будет иметь дополнительный бонус за возможность повторения значений перечисления в цикле for

Примечание. Хотелось бы, чтобы компилятор мог сгенерировать весь этот код, хотя бы для класса enum

Отказ от ответственности: я упоминаю библиотеку с открытым исходным кодом, которую я недавно опубликовал.

Возможно, вы захотите взглянуть на Better Enums. Это избавит вас от необходимости повторять что-либо.

#include <enum.h>
ENUM(Rotations, int, ZERO = 0, PLUS180 = 180, PLUS90 = 90, MINUS90 = -90)

Затем вы можете получить доступ к числу констант как

Rotations::_size

В настоящее время нет встроенного способа объявления значения по умолчанию. Однако конструктор по умолчанию в настоящее время является закрытым, поэтому при создании Rotations значение. Существует синтаксически "хороший" способ сделать это, показанный здесь - посмотрите, как недопустимый определяется с помощью шаблона. Это может быть полным излишним для ваших нужд. Если вы попробуете эту библиотеку и у вас есть какие-либо отзывы относительно значений по умолчанию, пожалуйста, дайте мне знать.

Я должен отметить, что количество и значение по умолчанию генерируются во время компиляции.

Другие вопросы по тегам