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

Объясните принцип шаблона Common_type - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Экспорт функции DLL http://www.cyberforum.ru/cpp/thread1849936.html
Вечер добрый. Работаю над проектом, в котором из DLL экспортируются функции для другого проекта. Столкнулся с проблемой, что сначала была VC 2010, и все работало. Потом поставил VС 2015 Community и не работает экспорт, как я понимаю. Вот код DLL: DLLALIVE_API char * GetName(void) { char * temp = "Alive"; char * pName = new char; int i = 0;
C++ Разработка класса для реализации различных видов сортировки символов в строке Здравствуйте. Нужна помощь по реализации проекта по ООП. Может кто-то уже сталкивался с подобными задачами и может поделится своими мыслями(примерами) о данном типе задач. Буду благодарен за любую помощь. Задача: Разработка класса для реализации различных видов сортировки символов в строке (выбором, пузырьком, перестановкой) на языке программирования Visual С++. Можно просто помочь с... http://www.cyberforum.ru/cpp/thread1849389.html
C++ Пульсометр выдает рандомные значения
Доброго времени суток, я пытаюсь усовершенствовать алгоритм для сенсора пульса (характеристики тут: https://www.maximintegrated.com/en/design/reference-design-center/system-board/6300.html/tb_tab0 ) Предложенный разработчиками алгоритм выдает значения от -999 до 500 при малейшем шевелении пальца, достичь более или менее постоянных значений крайне сложно. Можете подсказать, что нужно...
C++ Вызвать функцию из dll с неопределённым числом параметров
Нужно вызвать из dll функцию с неопределённым числом параметров. пока что работаю с таким вызовом char res; char (*dll) (char* ...); dll = (char (*)(char* ...))GetProcAddress(hlib, "alfa"); res=dll("abc"); cout << res << endl; Функция DLL просто возвращает значение обратно
C++ Вычисление суммы чисел, от параллельных процессов MPI http://www.cyberforum.ru/cpp/thread1847629.html
Задача такая, запускаются параллельно 5 процессов, каждый из них генерит рандомное число и отправляет соседнему процессу, нужно вывести сумму всех этих чисел. Вот что получилось #include <mpi.h> #include <stdio.h> #include <iostream> int rank, size; //int spisok1={0}; int *spisok1 = new int;
C++ Не работает рекурсивная функция У меня есть поле 80 на 80 клеток, с препятствиями. Функция должна в отдельный массив записавыть в соответствующую клеточку число, означающее, за сколько ходов туда можно добраться из начальных координат. Если в if приписать && n<3, то она работает, но в маленьком радиусе, если больше тройки число поставить, то уже не работает, никак не могу понять, в чем дело. void search(int x, int y, int n) ... подробнее

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

Объясните принцип шаблона Common_type - C++

14.11.2016, 17:35. Просмотров 266. Ответов 4
Метки (Все метки)

Читал шаблоны из распространённых библиотек и наткнулся на
C++
1
2
3
4
5
6
7
8
9
10
template<class _Ty0,
    class _Ty1>
    struct common_type<_Ty0, _Ty1>
    {   // type is common type of _Ty0 and _Ty1 for two arguments
    typedef typename decay<
        decltype(_Always_false<_Ty0>::value
            ? _STD declval<_Ty0>()
            : _STD declval<_Ty1>())
    >::type type;
    };
и понять не могу разве это не равно
C++
1
typedef typename decay<_Ty1>::type type;
В чем сакральный смысл был городить многоэтажную конструкцию выше?
C++
1
2
3
(_Always_false<_Ty0>::value
            ? _STD declval<_Ty0>()
            : _STD declval<_Ty1>()
всегда
C++
1
_STD declval<_Ty1>()
вешает правую ссылку
C++
1
2
3
template<class _Ty>
    typename add_rvalue_reference<_Ty>::type
        declval() _NOEXCEPT;
то есть
C++
1
2
3
decltype(_Always_false<_Ty0>::value
            ? _STD declval<_Ty0>()
            : _STD declval<_Ty1>())
равен
C++
1
add_rvalue_reference<_Ty1>::type
и не может вызвать ошибок компиляции потому что в этом шаблоне стоит условный оператор который просто не вешает ссылку на то, что не допускает добавить ссылку.
Но
C++
1
decay<add_rvalue_reference<_Ty1>::type>
на первом этапе убирает ссылку так, что равен просто
C++
1
typedef typename decay<_Ty1>::type type;
В итоге дополнительные этапы и ошибок не могут вызвать и сокращены могут до более простой записи.
Для чего тогда была записана длинная версия?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 09:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru