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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Необходимо протестировать костыль. Конвертирование Glib::ustring в sf::String http://www.cyberforum.ru/cpp/thread1565314.html
Есть строка Glib::ustring, пытался её конвертировать в sf::String, и вроде бы всё работает без особых костылей, но как добрался до кириллицы, нифига ничего не работает. Придумал такой костыль: sf::String convert_from_ustring (const Glib::ustring& source_string) { static std::wstringstream ss ; ss.clear() ; ss << source_string ; return sf::String(ss.str()) ; }
C++ Динамическая списочная структура, содержащая объекты классов, связанных наследованием В общем. Есть базовый класс и 2 класса наследника. Нужно создать динамическую структуру(пусть это будет односвязный список) в который можно добавлять или удалять объекты любого из 3-х классов. Я сделал односвязный список в который можно добавлять базовый класс. Но вот как реализовать возможность хранения в одном списке различных классов? #include <stdio.h> #include <iostream> #include... http://www.cyberforum.ru/cpp/thread1564885.html
Реализовать взаимодействие между процессами с помощью сигналов C++ WinAPI
Программная Реализация Между процессами с помощью сигналов на языке С\С++
Как найти расстояние между 2 линиями (OpenCV)? C++
Доброго времени Суток! у меня следующий вопрос. я с камеры получаю картинку с помщью OPENCV, и с помощью функций Canny и ROI получаю следующий результат. как можно, или можно ли вообще расчитать расстояние(pixel) между двумя краями(Линиями)? буду очень признателен за помощь
C++ Протестируйте функцию сортировки контейнера http://www.cyberforum.ru/cpp/thread1563232.html
У set контейнера странная сортировка, решил написать функцию которая увеличивала на одну единицу значение вектора. Вектор выступает как "виртуальное целое число". Так как стандартный обход char от 0 до -128 и увеличить переменную со значением -128 приведет что переменная будет равна 0. А сортировка у set контейнера от -128 до 127. Вопрос правильно ли работает моя функция. Я просто не знаю как...
C++ Поиск фигуры на картинке Суть задания: В окне программы рисуется фигура (треугольник или прямоугольник). При нажатии на кнопку "Go", в верхнем левом углу окна программы появляется объект (допустим в виде квдратика) у которого есть направление сканирования (хз как это еще описать). Он должен: 1. Найти фигуру (которую мы нарисовали в начале). 2. Приблизится впритык к фигуре. 3. Полностью обойти фигуру. 4. Выдать... подробнее

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

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

29.10.2015, 07:52. Просмотров 337. Ответов 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 или нет его.
Аналогично будут работать все остальные шаблоны обращающиеся к данному макросу.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 10:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru