Форум программистов, компьютерный форум CyberForum.ru

Decltype и typeof - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Mirmik
 Аватар для Mirmik
107 / 79 / 22
Регистрация: 27.02.2014
Сообщений: 434
18.05.2014, 13:20     Decltype и typeof #1
Товарищи.

Возникла проблема с пониманием std++11.
Насколько я понимаю typeof более не поддерживается.

Сегодня познакомился с std++11.
И возникла необходимость перейти с typeof на decltype.
Попытался тупо поменять.

Ранее было что-то вроде:
C++
1
2
3
4
5
6
class A{int x;};
A* a;
int main()
{
(typeof(*a)*)0;
}
и оно компилировалось.

Теперь по идее должно быть что-то вроде
C++
1
2
3
4
5
6
class A{int x;};
A* a;
int main()
{
(decltype(*a)*)0;
}
И оно не компилируется, выдавая cannot declare pointer to 'class A&'

Тоесть возвращается не 'A', который я ожидаю, а некое непонятное мне 'class A&', смысл которого мне неочевиден и...

В общем, спасайте...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
18.05.2014, 13:25     Decltype и typeof #2
тип выражения "разыменовывание указателя типа A" - ссылка на A.
зачем вы это в decltype делаете? может просто: decltype(a) 0; ?
Mirmik
 Аватар для Mirmik
107 / 79 / 22
Регистрация: 27.02.2014
Сообщений: 434
18.05.2014, 13:35  [ТС]     Decltype и typeof #3
Мой код использует линуксовые связные списки.

Вот цепочка, на которой засыпался код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void command_print()
{command_t* p;
list_for_each_entry(p,&command_head,list)
{};
 
#define list_for_each_entry(pos, head, member)              \
    for (pos = list_entry((head)->next, decltype(*pos), member);    \
         &pos->member != (head);    \
         pos = list_entry(pos->member.next, decltype(*pos), member))
 
#define list_entry(ptr, type, member) \
    container_of(ptr, type, member)
 
#define container_of(ptr, type, member) ({          \
    const decltype( ((type *)0)->member ) *__mptr = (ptr);  \
    (type *)( (char *)__mptr - offsetof(type,member) );})
А сильно переписывать реализацию списков бы не хотелось...
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
18.05.2014, 13:41     Decltype и typeof #4
ну и что следует из того, что он их использует? для этого в деклтайпе нужно что-то разыменовывать? я не понял.
можете еще попробовать с auto поиграться там, где вы переменные объявляете.
да и вообще на макросах так делать - хрень какая-то. на шаблонах код будет понятнее.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.05.2014, 13:45     Decltype и typeof #5
Вопрос отдает "хочу то, не знаю что". И не ясно зачем.
Посему:
1. Покажите минимальный компилируемый рабочий пример.
2. Скажите что конкретно не устраивает и чего хотите добиться.
3. Не забывайте о тегах для кода.
Mirmik
 Аватар для Mirmik
107 / 79 / 22
Регистрация: 27.02.2014
Сообщений: 434
18.05.2014, 13:45  [ТС]     Decltype и typeof #6
Я хочу решить с помощью decltype задачу, которая решалась typeof.

Если выкинуть все лишнее, проблема упирается в то, что

(decltype(*a)*)0;
и
(typeof(*a)*)0;

не одно и тоже.

Вопрос: Способен ли decltype решать туже задачу, что и typeof? Если да, то как, а если нет, то как из этого вывернуться?

Короче, нужен функциональный аналог typeof в стандарте std++11.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
18.05.2014, 14:00     Decltype и typeof #7
на вопрос из первого поста я вроде бы ответил. не работает чтоли вариант decltype(a) O;
в макросах же ситуация усугубляется тем, что там не контролируется то, что может подставится вместо
а. там могут присутствовать звездочки, амперсенды и т.п. там наверно нужна комбинация каких-нибудь
std::remove_reference<T>, std::remove_pointer<T> и прочая муть. и еще раз: возможно у вас все упростится
с использованием простого auto.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.05.2014, 14:24     Decltype и typeof #8
Цитата Сообщение от Mirmik Посмотреть сообщение
Вопрос: Способен ли decltype решать туже задачу, что и typeof?
а что такое typeof в С++ ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2014, 14:25     Decltype и typeof
Еще ссылки по теме:

C# System.Void из C# использоваться не может - для получения объекта типа void используйте typeof (void)
C++ Стивен Прата - про decltype (гл. 8, стр. 422)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.05.2014, 14:25     Decltype и typeof #9
Цитата Сообщение от Jupiter Посмотреть сообщение
а что такое typeof в С++ ?
Гнутое расширение, еще до стандартизации decltype.
http://gcc.gnu.org/onlinedocs/gcc/Typeof.html
Yandex
Объявления
18.05.2014, 14:25     Decltype и typeof
Ответ Создать тему
Опции темы

Текущее время: 03:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru