Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > О приведении типов


Автор: hoz 22.9.2014, 13:40
 Встретилась вот такая вот ситуация:
Код

ENUM_ORDER_TYPE type =(ENUM_ORDER_TYPE) HistoryOrderGetInteger(ticket,ORDER_TYPE);

Возник вопрос. В С++ такое разве применяется? Имею ввиду приведение типа другого порядке к другому.
Суть в том, что функция HistoryOrderGetInteger(ticket,ORDER_TYPE) возвращает тип long. А судя по этой строке, здесь long приводится к ENUM ? По-моему это не корректно..

Автор: baldina 22.9.2014, 14:07
это приведение в стиле C, применяется. конечно, такое приведение - потенциальный источник ошибок.
более современный способ - static_cast, но в данном случае лучше не станет.

Автор: math64 22.9.2014, 14:08
А что тут некорректного? enum - это фактически целое число, только может принимать конкретные значения.

Автор: hoz 22.9.2014, 14:58
Цитата(math64 @  22.9.2014,  14:08 Найти цитируемый пост)
А что тут некорректного? enum - это фактически целое число, только может принимать конкретные значения. 

Кто такое сказал? ENUM - это перечисление. А перечисление может быть любого типа...

Автор: borisbn 22.9.2014, 15:39
Цитата(hoz @  22.9.2014,  14:58 Найти цитируемый пост)
 перечисление может быть любого типа... 

Кто такое сказал?

Автор: NoviceF 22.9.2014, 16:22
Цитата(hoz @  22.9.2014,  15:58 Найти цитируемый пост)
А перечисление может быть любого типа... 

Возможно не в c++.  В c++ перечесление - это целочисленные константы времени компиляции.

Автор: baldina 22.9.2014, 17:35
Цитата(hoz @  22.9.2014,  14:58 Найти цитируемый пост)
перечисление может быть любого типа...

перечисление типа не имеет (оно само есть тип), но неявно приводится к целочисленным. обратное преобразование должно быть явным. в с++11 появились строго типизированные enum class, которые неявно не приводятся, и можно указать размер (конкретный целочисленный тип).
были предложения расширить на double, но не вошло.

кстати можно устроить специфическое перечисление времени компиляции без возможности даже явного приведения к целым, что используется например в категориях итераторов stl, упрощенно вроде
Код

struct iterator_tag {};
struct input_iterator_tag : iterator_tag {};
struct forward_iterator_tag : input_iterator_tag {};
struct bidirectional_iterator_tag : forward_iterator_tag {};
struct random_iterator_tag : bidirectional_iterator_tag {};
struct output_iterator_tag : iterator_tag {};
// ...
template <typename Iterator>
void reverse_impl (Iterator begin, Iterator end, forward_iterator_tag) {...}
template <typename Iterator>
void reverse_impl (Iterator begin, Iterator end, random_iterator_tag) {...}

template <typename Iterator>
void reverse (Iterator begin, Iterator end) {
  reverse_impl (begin, end, iterator_category(begin));
}

Автор: Lukkoye 29.9.2014, 00:51
Цитата(hoz @  22.9.2014,  14:58 Найти цитируемый пост)
Кто такое сказал? ENUM - это перечисление. А перечисление может быть любого типа... 


Не может. енум - синтаксический сахар над int, значения которого известно времени компиляции.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)