реклама на сайте
подробности

 
 
> enum в С++, как определить неявное преобразование одного enum к другому?
Сергей Борщ
сообщение Jan 26 2007, 18:55
Сообщение #1


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



задача в следующем:
Код
enum command_t {CMD1, CMD2, CMD3 };
enum device1_cmd {CMD4 = CMD3, CMD5, CMD6};
enum device2_cmd {CMD7 = CMD3, CMD8, CMD9};
т.е. есть некий общий набор команд и его расширения специфичные для разных устройств.
Теперь если я пытаюсь сделать
device1_cmd = CMD9;
то получаю ошибку a value of type "device2_cmd" cannot be used to initialize an entity of type "device1_cmd". Что правильно, и ради этого все enum и затевались.
но такую же ошибку я получаю и на
device1_cmd = CMD1;
а вот этого не хочется. Т.е. хочется объявить оператор неявного преобразования из command_t в device1_cmd. Как это сделать?

P.S. явное преобразование не хочется потому что можно случайно преобразовать совсем не то, что нужно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
v_shamaev
сообщение Jan 26 2007, 19:20
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259



Цитата(Сергей Борщ @ Jan 26 2007, 18:55) *
Теперь если я пытаюсь сделать
device1_cmd = CMD9;
то получаю ошибку a value of type "device2_cmd" cannot be used to initialize an entity of type "device1_cmd". Что правильно, и ради этого все enum и затевались.


Это же название типа, а не имя переменной. Определите переменную типа device1_cmd, а уж ей присваивайте значение


--------------------
Водку пьянствовать и безобразия нарушать!!!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 26 2007, 22:14
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(v_shamaev @ Jan 26 2007, 18:20) *
Цитата(Сергей Борщ @ Jan 26 2007, 18:55) *

device1_cmd = CMD9;

Это же название типа, а не имя переменной. Определите переменную типа device1_cmd, а уж ей присваивайте значение
Извиняюсь, кончно же у меня что-то вроде
Код
device1_cmd cmd1;
cmd1 = CMD5;    // проходит, ибо "родное"
cmd1 = CMD9;    // не проходит, и правильно
cmd1 = CMD1;    // не проходит, а я хочу чтоб проходило.
Вопрос - как сделать так, чтобы значение типа command_t неявно(!) при необходимости преобразовывалось к device1_cmd. С классами понятно - добавил конструктор и все. А как с enum?

Цитата(zltigo @ Jan 26 2007, 19:30) *
Код
aaaa = (device1_cmd)CMD1;

По идее должно работать
Да, работает. Но меня это не устраивает. Для чего заводится enum? Чтобы ненароком не присвоить переменной значение которого она никогда не может иметь. Ошибка отлавливается компилятором и сразу. Если я делаю приведение типов вручную, компилятор уже ничего не проверяет. Он пропустит и
Код
aaaa = (device1_cmd)CMD9;
а я хочу этого избежать.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 26 2007, 22:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Jan 26 2007, 21:14) *
Для чего заводится enum? Чтобы ненароком не присвоить переменной значение которого она никогда не может иметь.

Ага, и именно по этой причине желаемые НЕЯВНЫЕ прообразования с этим типом не могут быть в принципе.
Цитата
Если я делаю приведение типов вручную, компилятор уже ничего не проверяет. Он пропустит и
Код
aaaa = (device1_cmd)CMD9;
а я хочу этого избежать.

Лучше вручную, чем неявно.
Fuzzy logic хочется smile.gif smile.gif
Для пущей "безопасности" можно пробовать городить еще макрос для присвоения с наворотами - имя переменной в и CMDx намеспайсинг спрятать - прямо уже не присвоишь.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 07:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01422 секунд с 7
ELECTRONIX ©2004-2016