C ++ эквивалентный перечисление - преобразовать в константное выражение - PullRequest
1 голос
/ 22 ноября 2011

На основании этого вопроса:

эмуляция enum class или твердая альтернатива для MSVC 10.0

Я хотел бы спросить пару вещей. Предполагая этот код:

struct DeletionMode_E
{
    static DeletionMode_E const Off;
    static DeletionMode_E const DirSize;
    static DeletionMode_E const FileNumberSize;
    static DeletionMode_E const DirAndFileNumberSize;

    operator int const() const { return myVal; }

private:
    explicit DeletionMode_E(const int & v) : myVal(v) { }
    const int myVal;
};

и их последующие определения:

    Log4Reconstruction::DeletionMode_E const Log4Reconstruction::DeletionMode_E::Off(0);
    Log4Reconstruction::DeletionMode_E const Log4Reconstruction::DeletionMode_E::DirSize(1);
    Log4Reconstruction::DeletionMode_E const Log4Reconstruction::DeletionMode_E::FileNumberSize(2);
    Log4Reconstruction::DeletionMode_E const Log4Reconstruction::DeletionMode_E::DirAndFileNumberSize(3);

Можно использовать это как:

    void Log4Reconstruction::setDeletionMode( Log4Reconstruction::DeletionMode_E const & delMode_in)
    {
        std::cout << delMode_in << std::endl;

        switch(delMode_in)
        {
        //case Log4Reconstruction::DeletionMode_E::Off: C2051 case expression not constant
        //  std::cout << "Off" << std::endl;
        //  break;
        case 1:
            std::cout << "File number" << std::endl;
            break;
        }
    }

Почему вызывается оператор вызова функции? Как можно было бы назвать это вручную, чтобы решить «проблему» в постановке дела? Я использую MSVS 2008 нет доступны внешние библиотеки.

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

Здесь не объявлен оператор вызова функции.

operator int const() const { return myVal; }

Определяемое пользователем преобразование, которое преобразует объект типа DeletionMode_E в постоянное целое число. Чтобы вызвать его, вы должны выполнить приведение (это делается неявно в вашем switch -статменте).

2 голосов
/ 22 ноября 2011

В C ++ 03 вызов функции не может происходить в константном выражении (таком как метка регистра), поэтому это не нужно.В C ++ 11 вам просто нужно пометить функцию преобразования и конструктор как constexpr.

Я не уверен, что вы подразумеваете под «оператором вызова функции».Если вы имеете в виду функцию operator int const() (функция преобразования), она вызывается потому, что оператор switch ожидает интегральное выражение, поэтому функция преобразования используется для выполнения преобразования - это то, что они делают.Кстати, первый const бесполезен и должен быть operator int() const { return myVal; }.Чтобы вызвать его вручную, просто используйте его имя в обычном синтаксисе: delMode_in.operator int const().

Суффикс _E, кажется, указывает на эмуляцию некоторых аспектов перечислений.Почему бы просто не использовать enum?

...