Здравствуйте, Erop, Вы писали:
E>Здравствуйте, minorlogic, Вы писали:
M>>Еще одна большая проблема это смешивание значений разных енумов. Значение одного енума можно присвоить по ошибке другому енуму. Собственно с этой проблемой тоже бы неплохо бороться статической типизацией.
E>Разве так можно?
enum E1 { E11, E12 };
E>enum E2 { E21, E22 };
E>E2 var = E11; // тут не компилируется вроде
Зато многое другое компилируется на ура.
У енумов проблем вагон и маленькая тележка.
Здравствуйте, remark, Вы писали:
R>Наверное многие задавались вопросом — почему сделано так странно и нелогично, почему enum'ы выносят имена своих констант в окружающее пространство имён, хотя объявлены константы вроде как внутри самого enum'а?
В Boost.Vault есть реализация вашей идеи: Boost.Enum.
Может я что то не понимаю, но как реализована Base_t::enum_pairs()? То есть как сопостовляется строка и енум? Кстати, не могли бы вы привести пример декларации енума.
... << RSDN@Home 1.2.0 alpha rev. 730>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
A>template <typename T, typename InternalType = int>
A>class enum_class : public T
A>{
A> typedef typename T::type enum_t;
A> typedef InternalType internal_t;
A> ...
A> internal_t val_;
A>};
A>
Потерялось отладочное удобство встроенного enum-а: если в MSVC6-отладчике навести курсор на enum-переменную, то отладчик покажет значение переменной в символьном виде. С Вашим power-enum-ом так легко не получится .
Здравствуйте, Пётр Седов, Вы писали:
ПС>Потерялось отладочное удобство встроенного enum-а: если в MSVC6-отладчике навести курсор на enum-переменную, то отладчик покажет значение переменной в символьном виде. С Вашим power-enum-ом так легко не получится .
Да-с. Но если internal_t есть char, то никак не получится в принципе показать val_ в отладчике через enum_t, потому как у них разные размеры. Это можно только в случае, когда sizeof(internal_t) == sizeof(enum_t). Вот модифицированный вариант, который работает у меня в отладчике VC++ 8. Переменную смотреть в отладчике через debug_helper_.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Erop, Вы писали:
E>>Здравствуйте, minorlogic, Вы писали:
M>>>Еще одна большая проблема это смешивание значений разных енумов. Значение одного енума можно присвоить по ошибке другому енуму. Собственно с этой проблемой тоже бы неплохо бороться статической типизацией.
E>>Разве так можно?
enum E1 { E11, E12 };
E>>enum E2 { E21, E22 };
E>>E2 var = E11; // тут не компилируется вроде
А>Зато многое другое компилируется на ура. А>У енумов проблем вагон и маленькая тележка.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, Erop, Вы писали:
E>>Здравствуйте, igna, Вы писали:
I>>>Интересно. А вот простая как сатиновые трусы альтернатива:
E>>Альтернатива очень хорошая. Не зря ей все пользуются.
R>Ей все пользуются от безвыходности и от безальтернативности. Тем самым признавая, что проблема есть и ей нужно хоть какое-то решение.
R>
Не от безвыходности, а от оптимальности подхода. А альтернатива в С++ есть -- ты сам одну нарисовал.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Пётр Седов, Вы писали:
ПС>>Можно пример, где полезен расширяемый enum?
E>Например есть у меня класс, который поддерживает рабочие календари. И есть там enum Days { Mon, Tue, Wed, Thu, Fri }; И всё у нас хорошо. E>Но захотелось мне это дело расширить на всю неделю, завести у класса наследника, для трудоголика, который работает и в выходные.
E>Ну это смешной пример, но если не понятно что я имею в виду, то могу вспомнить и несмешной.
CVL>Может я что то не понимаю, но как реализована Base_t::enum_pairs()? То есть как сопостовляется строка и енум? Кстати, не могли бы вы привести пример декларации енума.
теоретически можно замакросить определение enumwrapper'а, но мы не заморачивались — enum'ы пишутся обычно один раз и нечасто модифицируются. а для локализации названий enum'ов по идее можно расширить NamedEnumPair и при заполнении использовать доступ к ресурсам с помощью какого-нибудь макроса: NamedEnumPair<Enum>(a, ENUM_TR("A")); — где ENUM_TR записывает в NamedEnumPair одновременно и нелокализованное значение и локализованное, полученное из ресурсов.
Здравствуйте, Erop, Вы писали:
S>>мы пошли еще немного дальше и каждому значению enum'а присвоили текстовое имя.
E>А мне нравится. E>Конечно все перечисления в программе так задавать немного расточительно, да и не надо, но вот всякие интерфейсные состояния свойств -- очень даже!!!
E>Только одно замечание/предложение. ИМХО выгодно иметь ДВА имени константы. Одно на языке интерфейса программы, а другое на языке C++, первое для интерфейса и из ресурсов или откуда вы там локализованные строчки берёте, а второе для логов и из макросов, соответсвенно. E>А так не так уж и плохо, ИМХО
в предыдущем сообщении я написал — добавить возможность использования локализованных названий enum'ов достаточно просто.
Не совсем понял про константу на языке интерфейса — само перечисление из enum'а разве не подходит в качестве названия?
а использовать действительно удобно и на клиентской стороне и на серверной чтобы выводить названия — что-то вроде
Здравствуйте, shadone, Вы писали:
S>Здравствуйте, remark, Вы писали:
R>>Наверное многие задавались вопросом — почему сделано так странно и нелогично, почему enum'ы выносят имена своих констант в окружающее пространство имён, хотя объявлены константы вроде как внутри самого enum'а?
S>мы пошли еще немного дальше и каждому значению enum'а присвоили текстовое имя.
Впечатление осталось немного двоякое. Т.к. реализация достаточно запутанная и нетривиальная по сравнению с простым енумом (я делал ещё более навороченный вариант с возможностью связывать тэги произвольного типа со значениями енума)
Это же максимально простой и не запутанный вариант — просто дописали пару строчек и получили кусочек синтаксического сахарку
Здравствуйте, sergey_shandar, Вы писали:
_>Здравствуйте, remark, Вы писали:
R>>Это уже получаются даже правильные С++0х enum'ы
R>>Добавляем типизацию низлежащего типа:
_>Может делать полное описание в def, т.е.
Можно. У меня была такая идея. Осталось только добавить sfinae, что бы тип было не обязательно указывать
Здравствуйте, Quasi, Вы писали:
Q>Здравствуйте, remark, Вы писали:
R>>Это уже получаются даже правильные С++0х enum'ы
R>>Добавляем типизацию низлежащего типа:
Q>
Да, действительно. Последний EDG без typename не компилит. А студии пофиг. Кстати, разьве тут может быть неоднозначность.
Я думал, что здесь как при указании базовых классов неоднозначности быть не может... там же typename уже вначале написано...
Здравствуйте, alexeiz, Вы писали:
A>Здравствуйте, Пётр Седов, Вы писали:
ПС>>Потерялось отладочное удобство встроенного enum-а: если в MSVC6-отладчике навести курсор на enum-переменную, то отладчик покажет значение переменной в символьном виде. С Вашим power-enum-ом так легко не получится .
A>Да-с. Но если internal_t есть char, то никак не получится в принципе показать val_ в отладчике через enum_t, потому как у них разные размеры. Это можно только в случае, когда sizeof(internal_t) == sizeof(enum_t). Вот модифицированный вариант, который работает у меня в отладчике VC++ 8.
Добавьте следующий код в файл:
Microsoft Visual Studio 8\Common7\Packages\Debugger\autoexp.dat
в секцию [Visualizer]:
Здравствуйте, alexeiz, Вы писали:
A>Здравствуйте, remark, Вы писали:
R>>Да, действительно. Последний EDG без typename не компилит.
A>Что за зверь такой этот последний EDG? Comeau что ли, или нет? Где его берут?
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, remark, Вы писали:
R>>Наверное многие задавались вопросом — почему сделано так странно и нелогично, почему enum'ы выносят имена своих констант в окружающее пространство имён, хотя объявлены константы вроде как внутри самого enum'а?
__>В Boost.Vault есть реализация вашей идеи: Boost.Enum.
Я знаю. Но это на порядок сложнее. С наворачиванием boost.pp поверх и т.д.
Я хотел сделать некий минимум действий с получанием кусочка синтаксического сахарка
Если не поленюсь, запосчу ещё свою реализацию енума с возможностью связывания произвольных тегов к значениям. Это ваще крута! Такого точно ни у кого нет!
Здравствуйте, alexeiz, Вы писали:
A>Здравствуйте, remark, Вы писали:
R>>http://www.edg.com/index.php?location=c_frontend
R>>Это только frontend. Стоит денег.
A>Ты хочешь сказать, что ты его купил? И потом, это же только front end. Он же ничего полезного сам по себе не делает.
Нет, я использую Comeau
Просто результат компиляции зависит именно от фронтенда, а что там в бекенде в данном случае совершенно не важно...