enum и константы

Помечено: , ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 8 мес., 1 неделя назад.

  • Автор
    Сообщения
  • #3634

    Многие авторитетные люди советуют использовать «enum» вместо «#define» для объявления констант. Это хорошая рекомендация — «enum», в отличие от «#define», подчиняется пространству имен. Вот пример такого использования:

    struct packet
    {
        enum
        {
            size = 1024,
            wait_echo = false
        };
    
        // ...
    };
    
    int main()
    {
        packet pck = packet();
    
        // ...
    
        send(pck);
    
        if(packet::wait_echo)
        {
            //...
        }
    
        return 0;
    }

    Однако, существует еще более лучшая рекомендация. Вместо «enum» используйте статические константы. Их точно так же можно инициализировать внутри класса и, в отличие от «enum», они несут больше информации о типе константы. Константами точно так же можно манипулировать статическими процессами (параметризовать и специализировать шаблоны, и так далее).

    struct packet
    {
        static std::size_t const size = 1024;
        static bool const wait_echo = false;
    
        // ...
    };
    
    int main()
    {
        packet pck = packet();
    
        // ...
    
        send(pck);
    
        if(packet::wait_echo)
        {
            //...
        }
    
        return 0;
    }

    Заметка к заметке:

    Глубокоуважаемый автором господин Вандевурд в своей книге «Шаблоны C++» рекомендует использовать все-таки первый способ. При всем своем уважении к господину Вандевурду, автор продолжает считать, что плюсы от честной и чистой типизации перевешивают все минусы, связанные с проблемами инстанцирования.

    Еще одна заметка:

    Все описанные тут проблемы enum были решены в новом стандарте С++ введением ключевого слова enum class. Все описанное тут является костылями и интересно чисто с исторической точки зрения, ну и еще в тех беспощадных случаях если вы по какой-то причине вынуждены использовать старый компилятор.

Для ответа в этой теме необходимо авторизоваться.