Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели на неименованные перечисления, где-нибудь использует или для "красоты" 
V
    Опции темы
null56
Дата 1.3.2012, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



Всем привет

сейчас перечитываю книжку Вандервуда по шаблонам с++ и увидел одну непривычную для себя инструкцию
http://reslib.com/book/Shabloni_S____Sprav...zrabotchika#132

указатель на неименованное перечисление ColorPtr

Вопрос: что можно сделать с переменной такого типа, кроме как присвоить ей значение NULL
Код

   typedef enum { one, two } * T;
   T a = NULL; // и всё?


Ну и тогда побочный вопрос, уже по книге, с той же страницы куда и ссылка
Автор пишет, что нельзя использовать в качестве аргументов шаблона неименованное перечисление, только когда они определены с помощью typedef. В приведенном в книге примере используется typedef, но всё равно автор пишет, что это ошибка...
Чему верить?

заранее благодарен всем откликнувшимся
PM MAIL   Вверх
borisbn
Дата 1.3.2012, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(null56 @  1.3.2012,  14:18 Найти цитируемый пост)
 что можно сделать с переменной такого типа, кроме как присвоить ей значение NULL

выделить под неё память с помощью new, но такииииииим извращенским способом...
Код

template< class T >
struct S {
    T x;
};

typedef enum { one, two } *E;
S< E > s_e;

int main()
{
    E ptr;
    s_e.x = new typename std::remove_reference< decltype( *ptr ) >::type;
    *s_e.x = one; // кстати, прикольное имя получилось :)
    if ( *s_e.x == one ) {
        std::cout << "one";
    }
    else {
        std::cout << "more then one";
    }
}

http://liveworkspace.org/code/7c03a8e84e25...150ce02c51f0c9c



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 1.3.2012, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(borisbn @  1.3.2012,  16:22 Найти цитируемый пост)
// кстати, прикольное имя получилось smile

это лучшая строка в коде smile 
PM WWW   Вверх
baldina
Дата 1.3.2012, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(null56 @  1.3.2012,  14:18 Найти цитируемый пост)
Вопрос: что можно сделать с переменной такого типа, кроме как присвоить ей значение NULL

в современном С++ кое-что можно
http://liveworkspace.org/code/69321f31f4b2...c0a66426c614108

Добавлено через 14 минут и 26 секунд
borisbn, а почему не написать просто
Код

typedef typename std::remove_reference< decltype(*E()) >::type enum_type;

PM MAIL   Вверх
borisbn
Дата 1.3.2012, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(baldina @  1.3.2012,  16:55 Найти цитируемый пост)
borisbn, а почему не написать просто

честно говоря, что то, что это выглядит паршиво. согласны ?
а вот про такую конструкцию
Цитата
new auto(a)

не знал. век живи... как говорится))


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
null56
Дата 1.3.2012, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



отличные ответы, спасибо
PM MAIL   Вверх
boostcoder
Дата 1.3.2012, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата

new auto(a)

кто-нибудь, объясните, как это работает.
я представляю то вместо auto тут должен быть decltype():
Цитата

new decltype(a)(a);

http://liveworkspace.org/code/9f1050e8f6d4...dc87286e11985cd

Это сообщение отредактировал(а) boostcoder - 1.3.2012, 20:22
PM WWW   Вверх
k0rvin
Дата 1.3.2012, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(boostcoder @ 1.3.2012,  19:44)
Код

ab_ptr_type a_ptr = new auto(a);

кто-нибудь, объясните, как это работает.

Элементарно:
тип a_ptr -- ab_ptr_type
ab_ptr_type -- указатель на элемент перечисления {a, b}
=> new auto(a) -- указатель на динамически созданное значение a из того перечисления.

Обычный вывод типов, хотя тут выглядит как магия.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 1.3.2012, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  1.3.2012,  21:56 Найти цитируемый пост)
Обычный вывод типов, хотя тут выглядит как магия.

для этого был создан decltype. а auto - тут как-то необычно смотрится..
PM WWW   Вверх
k0rvin
Дата 1.3.2012, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(boostcoder @ 1.3.2012,  22:19)
Цитата(k0rvin @  1.3.2012,  21:56 Найти цитируемый пост)
Обычный вывод типов, хотя тут выглядит как магия.

для этого был создан decltype. а auto - тут как-то необычно смотрится..

decltype для вывода типов? auto тут вполне логично смотрится.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
borisbn
Дата 2.3.2012, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(k0rvin @  1.3.2012,  21:56 Найти цитируемый пост)
Элементарно:
тип a_ptr -- ab_ptr_type
ab_ptr_type -- указатель на элемент перечисления {a, b}
=> new auto(a) -- указатель на динамически созданное значение a из того перечисления.

а как тогда это работает ?
Код
typedef enum { a, b } *ab_ptr_type;
int main () {
   auto a_ptr = new auto(a);
   auto b_ptr = new auto(b);
   std::cout << *a_ptr << std::endl << *b_ptr;
}

http://liveworkspace.org/code/f17ca1e0ea03...9b0adeb80c7e800

Цитата(k0rvin @  1.3.2012,  22:34 Найти цитируемый пост)
decltype для вывода типов?

ну, вообще-то, да.

Это сообщение отредактировал(а) borisbn - 2.3.2012, 12:44


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 2.3.2012, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(borisbn @  2.3.2012,  12:44 Найти цитируемый пост)
ну, вообще-то, да.

я решил не отвечать на это.
PM WWW   Вверх
k0rvin
Дата 2.3.2012, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(borisbn @ 2.3.2012,  12:44)
Цитата(k0rvin @  1.3.2012,  21:56 Найти цитируемый пост)
Элементарно:
тип a_ptr -- ab_ptr_type
ab_ptr_type -- указатель на элемент перечисления {a, b}
=> new auto(a) -- указатель на динамически созданное значение a из того перечисления.

а как тогда это работает ?
Код
typedef enum { a, b } *ab_ptr_type;
int main () {
   auto a_ptr = new auto(a);
   auto b_ptr = new auto(b);
   std::cout << *a_ptr << std::endl << *b_ptr;
}

Точно также, только, поскольку тип слева неизвестен, то он выводится из выражения справа, в котором известен тип a - enum{a,b}

Добавлено через 5 минут и 41 секунду
Цитата(borisbn @ 2.3.2012,  12:44)
ну, вообще-то, да.

Судя по описанию в вике, вообще-то нет.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
borisbn
Дата 2.3.2012, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(k0rvin @  2.3.2012,  15:31 Найти цитируемый пост)
Судя по описанию в вике, вообще-то нет. 

Цитата(wiki)
 decltype is an operator for querying the type of an expression

Почему нет-то ? "Вывод" типа или "запрос" типа - ИМХО разные названия одного и того же.
И почему тогда такая конструкция не работает
Код
auto a_value = auto( a );

а такая - работает
Код
auto a_value = decltype( a )( a );


нет... что-то в этом new auto не так...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
k0rvin
Дата 4.3.2012, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(borisbn @ 2.3.2012,  16:27)
Почему нет-то ? "Вывод" типа или "запрос" типа - ИМХО разные названия одного и того же.

Потому что "вывод типа" и "запрос типа (у выражения)" -- принципиально разные вещи. Decltype берет тип от выражения, тип которого уже известен (задекларирован). auto же вычисляет тип выражения, тип которого, заранее неизвестен.

Добавлено @ 14:55
Цитата(borisbn @ 2.3.2012,  16:27)
И почему тогда такая конструкция не работает
Код
auto a_value = auto( a );

Почему не работает? Ты же выше приводил код, где работает.

Это сообщение отредактировал(а) k0rvin - 4.3.2012, 14:55


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0964 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.