Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
 Аватар для IP_TCP
7 / 6 / 2
Регистрация: 19.08.2018
Сообщений: 108

typename в шаблонах

09.07.2020, 23:39. Показов 4822. Ответов 40

Вечер добрый.
Есть два примера: в первом - использование свойств типа is_array_v для преобразование Т внутри угловых скобок <> с оператором =, а во втором - ... тоже преобразование, но только с другой реализацией? Или как?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//1
template<typename T, typename = enable_if<is_array_v<T>> >
void someFoo(T &&a, T &&b)
{
    // ...
}
 
//2
template<typename T>
typename remove_reference_t<T> 
retV(T p)
{
    return T{};
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.07.2020, 23:39
Ответы с готовыми решениями:

Typename в шаблонах класса
В таком шаблоне: template &lt;typename T, int n, bool islong=???&gt; class CounterA{... требуется распознать тип, то есть переменная islong...

Access97 typename
Привет Алл! У меня вопрос почему функция typename вместо типа string,data, возвращает в access 97 accessfield или field или textbox. ...

typename и NULL
Ребята, выручайте! Есть шаблонный класс template &lt;typename T, ... в одном из методов нужно сравнить T с NULL'ом. Кто-нибудь...

40
 Аватар для IP_TCP
7 / 6 / 2
Регистрация: 19.08.2018
Сообщений: 108
10.07.2020, 16:32  [ТС]
oleg-m1973, из справочника даны два варианта(ниже) и автор считает их оба верными. Но вопрос мой в другом.
//1
C++
1
2
3
4
5
6
template<typename T>
typename remove_reference_t<T> 
retV(T p)
{
    return T{}; // Всегда возврат значения
}
//2
C++
1
2
3
4
5
template<typename T>
auto retV(T p)
{
    return std::remove_reference_t<T>{};
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.07.2020, 16:36
Цитата Сообщение от IP_TCP Посмотреть сообщение
Но вопрос мой в другом.
В смысле, в чём именно?

Добавлено через 1 минуту
Вот тебе ещё один вариант
C++
1
2
3
4
5
template<typename T, typename TRes = std::remove_reference_t<T>>
TRes retV(T p)
{
    return TRes{}; // Всегда возврат значения
}
0
 Аватар для IP_TCP
7 / 6 / 2
Регистрация: 19.08.2018
Сообщений: 108
10.07.2020, 16:36  [ТС]
oleg-m1973,
Вечер добрый.
Есть два примера: в первом - использование свойств типа is_array_v для преобразование Т внутри угловых скобок <> с оператором =, а во втором - ... тоже преобразование, но только с другой реализацией? Или как?

C++

//1
template<typename T, typename = enable_if_t<is_array_v<T>> >
void someFoo(T &&a, T &&b)
{
// ...
}

//2
template<typename T>
typename remove_reference_t<T>
retV(T p)
{
return T{};
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.07.2020, 16:38
typename = это значение по-умолчанию для параметра шаблона, по-аналогии с параметрами функции
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.07.2020, 16:54
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
template<typename T, typename TRes = std::remove_reference_t<T>>
TRes retV(T p)
{
    return TRes{}; // Всегда возврат значения
}
не всегда.
в этом варианте, в качестве TRes можно явным образом указать что угодно.
0
 Аватар для IP_TCP
7 / 6 / 2
Регистрация: 19.08.2018
Сообщений: 108
10.07.2020, 17:14  [ТС]
Я извиняюсь, что криво вопрос задал. В первом примере, наверное, больше проверка была на is_array_v, с последующем включении типа (потому как bool), а во втором примере уже преобразование Т с помощью remove_reference_t<T>. Тогда, правильно ли я понимаю, что bool мы можем использовать внутри <>, а преобразование только внешне?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.07.2020, 17:51
Лучший ответ Сообщение было отмечено IP_TCP как решение

Решение

Цитата Сообщение от IP_TCP Посмотреть сообщение
Тогда, правильно ли я понимаю, что bool мы можем использовать внутри <>, а преобразование только внешне?
"Внешне" мы можем использовать только типы данных. Константы, в частности is_array_v, не являются типом. Поэтому можно их использовать только в качестве значений для соответствующих параметров другого шаблона. Так у шаблонного класса enable_if первым параметром передаётся булевская константа.

Добавлено через 1 минуту
В параметрах шаблона, в скобках <>, слово typename или class означает, что должен передаваться тип, иначе - константа

Добавлено через 1 минуту
"Внешне" typename служит подсказкой компилятору, что зависимый тип, тот который после ::, является именно типом данных
1
 Аватар для IP_TCP
7 / 6 / 2
Регистрация: 19.08.2018
Сообщений: 108
10.07.2020, 18:34  [ТС]
oleg-m1973, спасибо. Вроде какое-то понимание есть.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
10.07.2020, 20:39
DrOffset, TheCalligrapher, зачем может понадобиться фиктивный параметр шаблона, где почитать?

Добавлено через 31 минуту
как я пока понял, они используются для отключение шаблонов с помощью enable_if<> в связке с технологией SFINAE?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
10.07.2020, 21:13
Цитата Сообщение от _stanislav Посмотреть сообщение
как я пока понял, они используются для отключение шаблонов с помощью enable_if<> в связке с технологией SFINAE?
это частный случай.

Параметр шаблона по умолчанию имеет в общем случае те же цели, что и параметр по умолчанию у функции: предоставлять некое умолчание.

Например у шаблона std::vector второй параметр - это как раз параметр по умолчанию, который представляет собой аллокатор.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
10.07.2020, 21:24
Цитата Сообщение от DrOffset Посмотреть сообщение
Параметр шаблона по умолчанию имеет в общем случае те же цели, что и параметр по умолчанию у функции: предоставлять некое умолчание.
Например у шаблона std::vector второй параметр - это как раз параметр по умолчанию, который представляет собой аллокатор.
про параметр шаблона по умолчанию, ясно, но фиктивный параметр как я понимаю не только имеет значение по умолчанию, но и не имеет имени?

Добавлено через 31 секунду
вот как раз когда нет имени, это интересный случай.

Добавлено через 7 минут
кажется въехаал, безымянный параметр шаблона нужен только для того что бы раскрыть шаблон enable_if<>, если не сработает SFINAE то он раскроется сделав тем самым второй безымянный параметр рабочим тем самым включит функцию на инстанцирование, но сам фиктивный параметр не нужен по этому у него нет имени. как то так?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
10.07.2020, 21:27
Цитата Сообщение от _stanislav Посмотреть сообщение
про параметр шаблона по умолчанию, ясно, но фиктивный параметр как я понимаю не только имеет значение по умолчанию, но и не имеет имени?
В С++ любой параметр (по умолчанию в том числе) может не иметь имени, это нормально )

Добавлено через 18 секунд
Цитата Сообщение от _stanislav Посмотреть сообщение
как то так?
Ага.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
10.07.2020, 21:28
Цитата Сообщение от DrOffset Посмотреть сообщение
Ага.
благодарю
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
10.07.2020, 21:49
Цитата Сообщение от IP_TCP Посмотреть сообщение
Для достижения безопасности возможны два варианта действий:
• Использовать свойство типа std::remove_reference<> (см. раздел Г.4)
для преобразования Т в тип, не являющийся ссылочным:
Во-первых, путаница вызвана тем, что вы использовали термин "преобразование" вне контекста. Термин "преобразование" в С++ уже занят и имеет вполне четкое значение, и здесь такого преобразования нет. Но в контексте становится понятно о чем идет речь. Под "преобразованием" имеется в виду та трансформация типов, которую выполняет std::remove_reference_t. Однако к ключевому слову typename, которое вы вынесли в заголовок вопроса это не имеет никакого отношения.

Во-вторых, в книге по-видимому изобилуют опечатки. typename remove_reference_t<T> - так нельзя. Правильно либо просто remove_reference_t<T>, либо typename remove_reference<T>::type. И, как уже правильно заметил oleg-m1973, в примере с std::enable_if должно быть либо enable_if_t<is_array_v<T>>, либо typename enable_if<is_array_v<T>>::type.

Такое впечатление, что кто-то на позднем этапе редактирования книги выкосил все ::type и заменил их на _t-версии соответствующих шаблонов, но забыл, что этим дело не ограничивается.

Добавлено через 5 минут
Цитата Сообщение от IP_TCP Посмотреть сообщение
Это пример из справочника. Что значит "не нужен, а так правильно")
Вы повторяете эти слова так, как будто это является гарантией некоей "правильности" информации, которую вы оттуда взяли.

Это не так. Ваш справочник крив, кос и содержит ошибку на ошибке. Были ли эти ошибки внесены при переводе или наляпаны самим автором справочника - вопрос отдельный, но факт остается фактом.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
10.07.2020, 21:56
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Такое впечатление, что кто-то на позднем этапе редактирования книги выкосил все ::type
Какой ужас. Сейчас проверил - все так и есть. И первый и второй примеры в оригинале без ошибок.
Теперь буду уточнять, чтобы читали оригинал.
PS. не видел русский перевод, поэтому не знал, что там такой бардак.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
10.07.2020, 22:04
Если ТС интересно, вот:
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
10.07.2020, 22:10
Цитата Сообщение от DrOffset Посмотреть сообщение
Сейчас проверил - все так и есть.
Я посмотрел PDF английского оригинала второго издания и PDF русского перевода второго издания. И там тоже нет этих ошибок. Интересно было бы взглянуть, что за версия у ТС...
Миниатюры
typename в шаблонах   typename в шаблонах  
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
10.07.2020, 22:12
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И там тоже нет этих ошибок.
Вот как...

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Интересно было бы взглянуть, что за версия у ТС...
Я теперь догадываюсь какая это версия. Похоже это утекший в сеть за 3 месяца (или около того) до релиза книги драфт.
0
 Аватар для IP_TCP
7 / 6 / 2
Регистрация: 19.08.2018
Сообщений: 108
10.07.2020, 22:13  [ТС]
DrOffset,DrOffset, да, в первом примере ошибка была сделана мной
template<typename T, typename = enable_if_t<is_array_v<T>> >
. Ее oleg-m1973, отметил сразу. Забыл поставить
_t
. Книга тут не причем. Эту ошибку я выше поправил с комментарием.
Такое впечатление, что кто-то на позднем этапе редактирования книги выкосил все ::type
И в оригинале все примеры, как я описал выше.
Это не так. Ваш справочник крив, кос и содержит ошибку на ошибке. Были ли эти ошибки внесены при переводе или наляпаны самим автором справочника - вопрос отдельный, но факт остается фактом
Это не мой справочник) Претензии пишите авторам. Вы лучше укажите на мои ошибки в примере, в объяснениях, а указать на плохую книжку и я могу.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
10.07.2020, 22:20
Цитата Сообщение от IP_TCP Посмотреть сообщение
а указать на плохую книжку и я могу.
Книжка отличная.

Цитата Сообщение от IP_TCP Посмотреть сообщение
Вы лучше укажите на мои ошибки в примере
Проблема в том, что финальном издании ошибок нет.
Если вы спиратили книгу, к чему лично я отношусь нейтрально, то просто спиратьте ее еще раз, в более качественном виде. Если эти косяки присутствуют в вашей электронной версии, то это однозначно какой-то утекший в сеть черновик.

Выше вам уже ответили про ошибки:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
typename remove_reference_t<T> - так нельзя. Правильно либо просто remove_reference_t<T>, либо typename remove_reference<T>::type. И, как уже правильно заметил oleg-m1973, в примере с std::enable_if должно быть либо enable_if_t<is_array_v<T>>, либо typename enable_if<is_array_v<T>>::type
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.07.2020, 22:20

Typename и Class
Между записью template &lt;class T&gt; и template &lt;typename T&gt; нет никакой разницы?

Оператор typename
Здравствуйте. Делал недавно небольшую программку и столкнулся с одной интересной штукой. Суть примерно такая template &lt;class T1,...

шаблоны и typename в частности
Здравствуйте! Я разбираюсь с ассоциативными контейнерами в с++ - делаю лабораторную по ним функция equal_range() одинакова для set,...

Typename перед инстанцированием
В каких случаях перед созданием объекта надо писать typename... И зачем оно там надо? typename hlist::iterator it = cell.begin();

Template<typename T> vs auto
template &lt;typename T&gt; vector&lt;T&gt; my_vec1; vector&lt;auto&gt; my_vec2;Какая разница между содержимым vec1 и vec2?


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru