Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

scoped_enum

Boost , Chapter 1. Boost.Core , Chapter 1. Boost.Core

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Authors

  • Беман Доуз
  • Vicente J. Botet Escriba
  • Энтони Уильямс

Заголовок<boost/core/scoped_enum.hpp>содержит ряд макросов, которые могут быть использованы для генерации C++11 объемных перечней (7.2 [dcl.enum]), если функция поддерживается компилятором, в противном случае эмулировать его с C++03 конструкций.<BOOST_NO_CXX11_SCOPED_ENUMS>Макро от Boost. Конфигурация используется для обнаружения поддержки функций в компиляторе.

Некоторые из перечислений, определенных в стандартной библиотеке, являются объемными.

enum class future_errc
{
    broken_promise,
    future_already_retrieved,
    promise_already_satisfied,
    no_state
};

Пользователь может портативно объявить такое перечисление следующим образом:

BOOST_SCOPED_ENUM_DECLARE_BEGIN(future_errc)
{
    broken_promise,
    future_already_retrieved,
    promise_already_satisfied,
    no_state
}
BOOST_SCOPED_ENUM_DECLARE_END(future_errc)

Эти макросы позволяют использовать<future_errc>практически во всех случаях в качестве объемного перечня.

future_errc ev = future_errc::no_state;

Можно указать базовый тип перечисления:

BOOST_SCOPED_ENUM_UT_DECLARE_BEGIN(future_errc, unsigned int)
{
    broken_promise,
    future_already_retrieved,
    promise_already_satisfied,
    no_state
}
BOOST_SCOPED_ENUM_DECLARE_END(future_errc)

Перечисление поддерживает явное преобразование из базового типа.

Перечисление может быть объявлено вперед:

BOOST_SCOPED_ENUM_FORWARD_DECLARE(future_errc);

Однако есть некоторые ограничения. Во-первых, эмулируемый объемный список не является C++, поэтому<is_enum< future_errc>>будет<false_type>.

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

switch (ev)
{
case future_errc::broken_promise:
    // ...

использовать

switch (boost::native_value(ev))
{
case future_errc::broken_promise:
    // ...

Вместо того, чтобы

template <>
struct is_error_code_enum< future_errc > :
    public true_type
{
};

использовать

template <>
struct is_error_code_enum< BOOST_SCOPED_ENUM_NATIVE(future_errc) > :
    public true_type
{
};

Наконец, явное преобразование в основной тип должно выполняться с<boost::underlying_cast>вместо<static_cast>:

unsigned int val = boost::underlying_cast< unsigned int >(ev);

Вот пример использования:

BOOST_SCOPED_ENUM_UT_DECLARE_BEGIN(algae, char)
{
    green,
    red,
    cyan
}
BOOST_SCOPED_ENUM_DECLARE_END(algae)
...
algae sample( algae::red );
void foo( algae color );
...
sample = algae::green;
foo( algae::cyan );

В ранних версиях заголовка было два способа объявить ограниченные числа с различными плюсами и минусами для каждого. Другой способ использовал другой набор макросов:

BOOST_SCOPED_ENUM_START(algae)
{
    green,
    red,
    cyan
};
BOOST_SCOPED_ENUM_END
...
BOOST_SCOPED_ENUM(algae) sample( algae::red );
void foo( BOOST_SCOPED_ENUM(algae) color );
...
sample = algae::green;
foo( algae::cyan );

Здесь<BOOST_SCOPED_ENUM_START>соответствует<BOOST_SCOPED_ENUM_DECLARE_BEGIN>,<BOOST_SCOPED_ENUM_END>-<BOOST_SCOPED_ENUM_DECLARE_END>и<BOOST_SCOPED_ENUM>-<BOOST_SCOPED_ENUM_NATIVE>. Заметьте также полуколонн перед<BOOST_SCOPED_ENUM_END>.

В текущей версии эти макросы дают эквивалентный результат описанным выше и считаются обесцененными.

Заголовок<boost/core/underlying_type.hpp>определяет метафункцию<boost::underlying_type>, которая может быть использована для получения основного типа охватываемого перечня. Эта метафункция поддерживает эмулированные объемные числа, объявленные макросами<boost/core/scoped_enum.hpp>. Когда собственные объемные числа поддерживаются компилятором, эта метафункция эквивалентна<std::underlying_type>.

К сожалению, существуют конфигурации, которые реализуют ограниченные числа, но не<std::underlying_type>. В этом случае<boost::underlying_type>должен быть специализирован пользователем. Макро<BOOST_NO_UNDERLYING_TYPE>обозначает такие случаи.

Эта эмуляция Enum была разработана Beman Dawes, Vicente J. Botet Escriba и Anthony Williams.

Полезные комментарии и предложения высказали также Кьель Эльстер, Фил Эндекот, Джоэль Фальку, Матиас Гаунард, Фелипе Магно де Алмейда, Мэтт Калабрезе, Даниэль Джеймс и Андрей Семашев.


PrevUpHomeNext

Статья scoped_enum раздела Chapter 1. Boost.Core Chapter 1. Boost.Core может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 1. Boost.Core ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 02:29:11/0.0067379474639893/1