Форум программистов, компьютерный форум, киберфорум
Наши страницы

Чем _Get_pointer_type отличается от обычного получения типа указателя - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Необходимо протестировать костыль. Конвертирование Glib::ustring в sf::String http://www.cyberforum.ru/cpp/thread1565314.html
Есть строка Glib::ustring, пытался её конвертировать в sf::String, и вроде бы всё работает без особых костылей, но как добрался до кириллицы, нифига ничего не работает. Придумал такой костыль:...
C++ Динамическая списочная структура, содержащая объекты классов, связанных наследованием В общем. Есть базовый класс и 2 класса наследника. Нужно создать динамическую структуру(пусть это будет односвязный список) в который можно добавлять или удалять объекты любого из 3-х классов. Я... http://www.cyberforum.ru/cpp/thread1564885.html
C++ Протестируйте функцию сортировки контейнера
У set контейнера странная сортировка, решил написать функцию которая увеличивала на одну единицу значение вектора. Вектор выступает как "виртуальное целое число". Так как стандартный обход char от 0...
C++ Поиск фигуры на картинке
Суть задания: В окне программы рисуется фигура (треугольник или прямоугольник). При нажатии на кнопку "Go", в верхнем левом углу окна программы появляется объект (допустим в виде квдратика) у...
C++ Ссылка для скачивания visual studio 2010 professional http://www.cyberforum.ru/cpp/thread1562518.html
В интернете постоянно, когда скачиваю visual studio 2010 professional rus выходит при установке образ жесткого диска, но так никогда не было когда скачивала раньше. Старая установка исчезла из-за...
C++ Парсинг файлов .dem Приветствую, ребята, в инете что-то не могу найти инфу по этому вопросу, в частности нужна структура файла .dem (это демо контры, халвы и т.п. подобных проектов h2l) Если кто знаком - киньте ссылки... подробнее

Показать сообщение отдельно
Archi0
28 / 14 / 4
Регистрация: 18.07.2013
Сообщений: 170

Чем _Get_pointer_type отличается от обычного получения типа указателя - C++

29.10.2015, 07:52. Просмотров 370. Ответов 6
Метки (Все метки)

При попытке более детально понять работу стандартных контейнеров в STD столкнулся с немалым количеством головоломок. вот одна из них.
C++
1
typedef typename _Get_pointer_type<_Alloc>::type pointer;
переходим к объявлению

C++
1
2
3
template<class _Ty>
    struct _Get_pointer_type
    _GET_TYPE_OR_DEFAULT(pointer, typename _Ty::value_type *);
Читаем макрос

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#define _GET_TYPE_OR_DEFAULT(TYPE, DEFAULT) \
    { \
    template<class _Uty> \
        static auto _Fn(int) \
            -> _Identity<typename _Uty::TYPE>; \
 \
    template<class _Uty> \
        static auto _Fn(_Wrap_int) \
            -> _Identity<DEFAULT>; \
 \
    typedef decltype(_Fn<_Ty>(0)) _Decltype; \
    typedef typename _Decltype::type type; \
    }
Возникает вопрос, а чем этот код отличается от обычного получения типа указателя. Я разгадал этот ребус.

следующий код показал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
template <class _Ty>
class Get_pointer
{
public:
    typedef _Ty* pointer;
};
 
template <class _Ty>
class Probationer
{
public:
    typedef _Ty value_type;
    typedef _Ty pointer;
};
 
template <class _Ty>
class Probationer2
{
public:
    typedef _Ty value_type;
};
 
int func0(int, int)
{
    return 0;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    auto x = func0;
    Get_pointer < int (*) (int,int) >::pointer vb =  &x;
    std::_Get_pointer_type< Probationer<int (*) (int,int)> >::type g = func0;
    std::_Get_pointer_type< Probationer<int(*) (int, int)> >::_Decltype::type j;
    j = g;
    std::_Get_pointer_type< Probationer2<int(*) (int, int)> >::type g2 = vb;
    std::_Get_pointer_type< Probationer2<int(*) (int, int)> >::_Decltype::type j2;
    j2 = g2;
    return 0;
}
что, если у класса _Ty есть type pointer, то именно он будет возвращён в
C++
1
typedef typename _Get_pointer_type<_Alloc>::type pointer;
, если же его нет, то будет возвращён type value_type.
Если же type value_type отсутствует, то у вас просто не скомпилируется код независимо от наличия type pointer.

Как это работает.
Внутри класса создается два шаблона функции _Fn без тела. Затем decltype пытается вычислить тип возвращаемого значения. Если у типа есть type pointer, то 0 как int является приоритетным выбором, среди перегруженных шаблонов. Если же данного типа нет, то 0 преобразуется к структуре _Wrap_int
C++
1
2
3
4
5
6
struct _Wrap_int
    {   // wraps int so that int argument is favored over _Wrap_int
    _Wrap_int(int)
        {   // do nothing
        }
    };
Мы видим, что у этой структуры как раз есть конструктор от int
И будет использован второй вариант шаблона _Fn

C++
1
2
3
4
5
template<class _Ty>
    struct _Identity
    {   // map _Ty to type unchanged, without operator()
    typedef _Ty type;
    };
Здесь все просто type просто вернет _Ty
Следовательно эта строчка
C++
1
typedef typename _Decltype::type type;
вернет то, что внутри _Identity, а из первого или второго, уже будет завесить от того есть ли type pointer или нет его.
Аналогично будут работать все остальные шаблоны обращающиеся к данному макросу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru