Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
31 / 17 / 5
Регистрация: 18.07.2013
Сообщений: 220

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

14.11.2016, 17:35. Показов 2244. Ответов 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;
В итоге дополнительные этапы и ошибок не могут вызвать и сокращены могут до более простой записи.
Для чего тогда была записана длинная версия?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2016, 17:35
Ответы с готовыми решениями:

Возвращаемый тип шаблона через std::common_type
Вот отрывок моего кода. Не могу понять как определить возвращаемый тип объекта matrix. template&lt;typename V, typename U, size_t R,...

Принцип инициализации статических членов шаблона класса
Доброго времени суток. Рассмотрим пример: #include &lt;iostream&gt; int foo(){ return 0; } template&lt;class T&gt; struct...

Объясните принцип
printf(&quot;%.2lf&quot;, x) Объясните пожалуйста понятным языком, что делает эта вещь &quot;%.2lf&quot;?

4
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
14.11.2016, 20:49
Лучший ответ Сообщение было отмечено Archi0 как решение

Решение

Archi0, у тебя шаблон как называется?
Правильно - common_type.
Это значит, что выбирается общий тип между двумя переданными. Поэтому твое предположение про использование только _Ty1 сломает логику, это уже чисто на интуиции должно было сработать

Само условие "всегда false" нужно для того, чтобы condition expression ?: вывел нам из двух своих операндов общий тип. Condition expression использует стандартные преобразования (арифметические преобразования, преобразования указателей и др., см. в стандарте детали), если типы различаются. И это не всегда будет один из типов операндов. Например, для выражения decltype(false ? short(1) : char(2)) выведен будет int.
3
31 / 17 / 5
Регистрация: 18.07.2013
Сообщений: 220
15.11.2016, 04:44  [ТС]
В чем отличие от
C++
1
decltype(_Always_false<_Ty0>::value ? _Ty0: _Ty1>)
Для чего используются правые ссылки?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
15.11.2016, 09:05
Цитата Сообщение от Archi0 Посмотреть сообщение
В чем отличие от
Во-первых так нельзя. Не скомпилируется. Операндами должны быть объекты. Т.е. так:
C++
1
decltype(_Always_false<_Ty0>::value ? _Ty0() : _Ty1()>)
Хоть на самом деле ни один из объектов не будет создан, но все требования к типам, которые накладывает такая запись, должны быть соблюдены. В частности, эта запись требует наличия конструктора без параметров. Не все типы могут предоставить такой конструктор. Поэтому для получения объекта в выражении используется declval().

Цитата Сообщение от Archi0 Посмотреть сообщение
Для чего используются правые ссылки?
Предположим, что declval() у нас реализован так:
C++
1
2
template <typename T>
T declval();
Если мы используем его с типом, например, int[2], то будет ошибка компиляции, т.к. массивы нельзя возвращать по значению. Также, аргументом шаблона могут быть типы с отсутствующим (удаленным или помещенным в private) конструктором копирования, и это тоже приведет к ошибке компиляции в случае использования такого declval(). Поэтому используется ссылка. Например, благодаря этому, можно вывести общий тип для двух массивов:
C++
1
common_type<int[3], int[4]>::type; // -> int *
2
31 / 17 / 5
Регистрация: 18.07.2013
Сообщений: 220
15.11.2016, 15:47  [ТС]
Дополнение к работе ?:, чтобы тема была полностью раскрыта.
попробовал код снизу
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
class C
{};
 
class A
{
public:
    operator C() const
    {
        return C();
    }
};
 
class B
{
public:
    operator C() const
    {
        return C();
    }
    /*
    operator A() const
    {
        return A();
    }
    */
};
 
template <>
struct std::common_type<A, B>
{
    typedef C type;
};
 
int main()
{
    std::common_type<A, B>::type w;
    class C c = w;
Если убрать явную специализацию шаблона, то будет ошибка B не может быть преобразована в A.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2016, 15:47
Помогаю со студенческими работами здесь

Объясните принцип работы программы
Добрый день, мне нужно понять, как работает эта программа (она находит самое длинное слово из текста). Желательно рассказать про каждую...

Объясните принцип создания многопоточности
Здраствуйте, объясните пожалйста как сделать программу многопоточной, у меня есть одна программа, в которой большая нагрузка идет на...

объясните принцип работы цикла : ?
объясните принцип работы цикла : ?

Объясните принцип бинарного поиска
Можно, пожалуйста, пример или принцип бинарного поиска. С++ для очень сильно начинающих.

Объясните принцип работы программы
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop #include &lt;conio.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru