Як отримати основний тип переліку?

З такою декларацією, як:

enum DrawBoldMode : unsigned
{
    DBM_NONE =              0,
    DBM_ITEM =              1<<0,  //bold just the nearest line
    DBM_SECTION =           1<<1,  //bold all lines in the same section
    DBM_LINETYPE =          1<<2,  //bold all lines of the same line type
    DBM_POINTAGE =          1<<3,  //bold all lines of the same line type
};

Як я можу отримати вихідний тип DrawBoldMode (тобто непідписаний)?

10
Д'о-я назавжди забуваю, що x ^ y в C ++ є xor не влада. Зітхає ...: П
додано Автор Mordachai, джерело
BTW, 2 ^ 0 - 2 XOR 0. Я вірю, що ви хочете (1 << 0), (1 << 1), (1 << 2), і т. Д.
додано Автор Thomas Matthews, джерело
Це не представляється можливим, шаблони чи інше.
додано Автор n.m., джерело
Я не думаю, що це може бути зроблено, принаймні всі основні типи є унікальними розмірами.
додано Автор Mooing Duck, джерело

2 Відповіді

std::underlying_type is available in GCC 4.7, but until then you can get an approximate emulation with templates:

#include 
// This is a hack because GCC 4.6 does not support std::underlying_type yet.
// A specialization for each enum is preferred
namespace detail {
    template 
    struct filter;

    template 
    struct filter {
        typedef typename std::tuple_element<0, Acc>::type type;
    };

    template 
    struct filter, Head, Tail...>
    : std::conditional< T(0)) == (Head(-1) < Head(0))
                      , filter, Tail...>
                      , filter, Tail...>
                      >::type {};

    template 
    struct find_best_match : filter<>, In...> {};
}

namespace std {
    template 
    struct underlying_type : detail::find_best_match {};
}

Це не дає точного типу, але він дає вам один з однаковими розмірами та характеристиками підписки.

11
додано
Перегляньте stackoverflow.com/a/10956467/464581 , щоб отримати більш короткий та простіший огляд.
додано Автор Cheers and hth. - Alf, джерело

It should be available as std::underlying_type::type. However, my compiler (GCC 4.6.1) doesn't seem to implement that.

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

7
додано
Ах - це наступний оновлений компілятор для нас, то, з усією ймовірністю. VS 2010 також не реалізує цього. : П.
додано Автор Mordachai, джерело
Здається, це згодні з вами: groups.google .com/group/comp.std.c ++/browse_thread/thread/& hellip;
додано Автор Mordachai, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147