![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Ivan. |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
Доброе время суток.
подскажите, требуется определить знаковый или без знаковый тип. один из вариантов решения - это template
все базовые знаковые типы возвращают true, а все прочие типы возвращают false, но что делать, если тип рожден от базового знакового типа? например:
этот тип не попадает под специализированный шаблон и возвращает false. конечно можно при объявлении очередного типа описывать шаблон SignDetection, но это не удобно и рано или поздно забудешь его описать, а потом придется ехать куда нибудь в Ямал перепрошивать контроллер. можно ли как нибудь написать обобщенный шаблон для таких случаев? Добавлено через 5 минут и 33 секунды чуть промахнулся разделом, можно переместить в C/C++: Общие вопросы -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
||||
|
|||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
#include <limits>, далее по обстоятельствам.
|
|||
|
||||
Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
не вижу решения
-------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
А по старинке не подойдет?
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
во-первых, есть std::is_signed в type_traits
во-вторых, MyEnum не является арифметическим типом, и не может быть знаковым или беззнаковым |
|||
|
||||
Ivan. |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
в gcc такого не нашел
Информация устаревшая, смотри C++11,14 Добавлено через 9 минут и 1 секунду
аналогичный способ у меня был реализован, к нему и вернемся
а для объектов не имеющих операторов сравнения и конструктора от int придется писать специализированный шаблон
-------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
||||||||
|
|||||||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
стандарт говорит
а вот говорит gcc, C++14: http://ideone.com/zgVldn если у вас более свежая информация, дайте пруфлинк
Это сообщение отредактировал(а) baldina - 19.2.2015, 12:30 |
||||
|
|||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Можете использовать underlying_type что бы вытянуть тип енума и уже его проверять на знак
http://en.cppreference.com/w/cpp/types/underlying_type |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
да, можно. только ничего не решает, т.к.
1. сам енум остается нечисловым типом, у которого нет понятия знака 2. в случае знакового родителя невозможно определить, какого знака элементы енума. возможно только какого они могут быть просто я не понимаю зачем может потребоваться определение знака енума, т.к. это абстрактное множество, а нумерация его элементов это лишь реализация. оптимизация? допустим... но придумать место этой оптимизации я не смог. типичное использование underlying_type - определение размера и кастование к базовому типу для передачи туда, где нет енумов, а причем тут знак... |
|||
|
||||
Ivan. |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
то что шаблоны is_signed и is_unsigned от enum возвращают false - это не значит, что enum не является не тем не другим, это значит, что эти шаблоны его так определяют. это всего лишь один из методов определения знака написанный человеком.
enum это замена целочисленных констант словами. пример:
мы можем сравнить a < b ? и как будет выполнено сравнение? со знаком или без? а если мы решим произвести умножение
и самое интересное:
Warning 1 comparison between signed and unsigned integer expressions это значит, что A1 является знаковым Это сообщение отредактировал(а) Ivan. - 20.2.2015, 09:25 -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
||||||||
|
|||||||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
Ivan., все, что вы привели, замечательно, но на вопрос не отвечает. причем тут enum? в ваших примерах это могут быть просто константы: главные свойства enum - ограниченноcть множества значений и их общность (единый тип) - не используются.
обсуждать технические нюансы решений, прикладной смысл которых не ясен, имхо пустое занятие (именно в этот момент возникает столь нелюбимый топикстартерами вопрос "зачем вам это" ). можно, конечно, придумать множество изощренных способов использования перечислений, только от них обычно больше головной боли, чем пользы. и практически всегда можно заменить более простыми конструкциями ЗЫ. изучаете язык по сообщениям компилятора? ну-ну... Это сообщение отредактировал(а) baldina - 20.2.2015, 01:34 |
|||
|
||||
Lukkoye |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 23.3.2013 Репутация: 1 Всего: 1 |
Обычный enum - сахар над int.
Он - знаковый. Остальные - наследуют все свойства тех типов, от которых они унаследованы. Что енум не является интегральным типом. Из этого никак не вытекает, что он не является арифметическим. (хотя енум на самом деле не является арифметическим типом, согласно std)
Да, fruit знаковый, поскольку унаследовал все свойства интегрального типа, от которого он образован. orange - положительный, поскольку по дефолту первый элемент - ноль, а остальные инкриментируются.
При том, что такой enum реализует отношение "является", когда наследуется от интегрального типа. Он наследует его свойства, его особенности, если хотите. Более того: в операциях с енум этот фактор учитывается. Необходимо учитывать ограниченность возможных значений такого енума, например. Из этой необходимости прямо вытекает необходимость учитывать знаковость енума:
Фактически, енум отличается от базового типа, от которого он унаследовался только возможностью задавать именованные константы времени компиляции. Важно понимать, что защита приведения типов, а так же запрет арифметических операций - это искусственные ограничения. А сам енум по сути - всего лишь сахар над интегральными типами. Предназначение которого - типизированные, именованные константы гарантированно времени компиляции. Это сообщение отредактировал(а) Lukkoye - 20.2.2015, 03:23 |
||||||||
|
|||||||||
Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
от еnum очень много пользы: 1. наглядность (RED, GREEN, BLUE) (REQUEST, RESPONSE) (COMMAND1, ..., COMMAND5) 2. невозможность присвоить типу Color значение REQUEST 3. автоинкрементор 4. защита в switch от пропущенного case при отсутствии default. если в енум добавили новый аргумент (COMMAND6) то все switch попросят добавить обработку данного значения (опять же если отсутствует default) 5. специализация шаблонов template<> struct TypeName {constexpr static const char name[] = "Цвет";}; 6. декларация enum MyEnum; (библиотека будет знать, что когда нибуть будет описан MyEnum) и множество других приимуществ недостатки: 1. нельзя наследовать енум от другого енума и продолжить автоинкрементор enum ExtColor: Color {}; 2. невозможность проводить арифметические действия: color = RED + GREEN; но это скорее польза, а не недостаток. защита от создания несуществующего значения енума. приведи мне хоть один реальный недостаток енумов Зачем мне знаковый енум? enum SensorChannel: signed {NO_SENSOR = -1, SENSOR1, SENSOR2}; библиотека, где продекларирован enum SensorChannel: signed; не знает количество датчиков, которое будет описано в проекте, но точно знает, что отрицательное значение означает отсутствие канала датчика. Зачем мне определять знак енума? честно говоря не хочу сейчас распинаться описывая свою задачу. надо, значит надо. PS. тема давно закрыта и решение найдено -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |