Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > определение знакового типа с помощью template |
Автор: Ivan. 30.1.2015, 20:11 | ||||
Доброе время суток. подскажите, требуется определить знаковый или без знаковый тип. один из вариантов решения - это template
все базовые знаковые типы возвращают true, а все прочие типы возвращают false, но что делать, если тип рожден от базового знакового типа? например:
этот тип не попадает под специализированный шаблон и возвращает false. конечно можно при объявлении очередного типа описывать шаблон SignDetection, но это не удобно и рано или поздно забудешь его описать, а потом придется ехать куда нибудь в Ямал перепрошивать контроллер. можно ли как нибудь написать обобщенный шаблон для таких случаев? Добавлено через 5 минут и 33 секунды чуть промахнулся разделом, можно переместить в C/C++: Общие вопросы |
Автор: tzirechnoy 30.1.2015, 20:18 |
#include <limits>, далее по обстоятельствам. |
Автор: Ivan. 30.1.2015, 20:26 |
не вижу решения |
Автор: xvr 2.2.2015, 14:51 | ||
А по старинке не подойдет?
|
Автор: baldina 2.2.2015, 16:45 |
во-первых, есть std::is_signed в type_traits во-вторых, MyEnum не является арифметическим типом, и не может быть знаковым или беззнаковым |
Автор: baldina 19.2.2015, 12:21 | ||||
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf говорит
а вот говорит gcc, C++14: http://ideone.com/zgVldn если у вас более свежая информация, дайте пруфлинк
|
Автор: sQu1rr 19.2.2015, 16:10 |
Можете использовать underlying_type что бы вытянуть тип енума и уже его проверять на знак http://en.cppreference.com/w/cpp/types/underlying_type |
Автор: baldina 19.2.2015, 17:45 |
да, можно. только ничего не решает, т.к. 1. сам енум остается нечисловым типом, у которого нет понятия знака 2. в случае знакового родителя невозможно определить, какого знака элементы енума. возможно только какого они могут быть просто я не понимаю зачем может потребоваться определение знака енума, т.к. это абстрактное множество, а нумерация его элементов это лишь реализация. оптимизация? допустим... но придумать место этой оптимизации я не смог. типичное использование underlying_type - определение размера и кастование к базовому типу для передачи туда, где нет енумов, а причем тут знак... |
Автор: Ivan. 19.2.2015, 22:30 | ||||||||
то что шаблоны is_signed и is_unsigned от enum возвращают false - это не значит, что enum не является не тем не другим, это значит, что эти шаблоны его так определяют. это всего лишь один из методов определения знака написанный человеком. enum это замена целочисленных констант словами. пример:
мы можем сравнить a < b ? и как будет выполнено сравнение? со знаком или без? а если мы решим произвести умножение
и самое интересное:
Warning 1 comparison between signed and unsigned integer expressions это значит, что A1 является знаковым |
Автор: baldina 20.2.2015, 01:32 |
Ivan., все, что вы привели, замечательно, но на вопрос не отвечает. причем тут enum? в ваших примерах это могут быть просто константы: главные свойства enum - ограниченноcть множества значений и их общность (единый тип) - не используются. обсуждать технические нюансы решений, прикладной смысл которых не ясен, имхо пустое занятие (именно в этот момент возникает столь нелюбимый топикстартерами вопрос "зачем вам это" ). можно, конечно, придумать множество изощренных способов использования перечислений, только от них обычно больше головной боли, чем пользы. и практически всегда можно заменить более простыми конструкциями ЗЫ. изучаете язык по сообщениям компилятора? ну-ну... |
Автор: Lukkoye 20.2.2015, 03:19 | ||||||||
Обычный enum - сахар над int. Он - знаковый. Остальные - наследуют все свойства тех типов, от которых они унаследованы. Что енум не является интегральным типом. Из этого никак не вытекает, что он не является арифметическим. (хотя енум на самом деле не является арифметическим типом, согласно std)
Да, fruit знаковый, поскольку унаследовал все свойства интегрального типа, от которого он образован. orange - положительный, поскольку по дефолту первый элемент - ноль, а остальные инкриментируются.
При том, что такой enum реализует отношение "является", когда наследуется от интегрального типа. Он наследует его свойства, его особенности, если хотите. Более того: в операциях с енум этот фактор учитывается. Необходимо учитывать ограниченность возможных значений такого енума, например. Из этой необходимости прямо вытекает необходимость учитывать знаковость енума:
Фактически, енум отличается от базового типа, от которого он унаследовался только возможностью задавать именованные константы времени компиляции. Важно понимать, что защита приведения типов, а так же запрет арифметических операций - это искусственные ограничения. А сам енум по сути - всего лишь сахар над интегральными типами. Предназначение которого - типизированные, именованные константы гарантированно времени компиляции. |
Автор: Ivan. 20.2.2015, 08:15 | ||
от е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. тема давно закрыта и решение найдено |