32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
1

Шаблоны C++11

11.09.2013, 23:06. Показов 1164. Ответов 15
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
 
template<typename T1, typename T2> 
auto func(T1 a, T2 b) -> decltype(a>b?b:a) 
{ 
    return a>b?b:a; 
} 
 
int main() 
{ 
    int a = 3; 
    double b = 5; 
    std::cout << func<double, double>(a,b)/2; 
    //std::cout << func(a,b)/2; 
    return 0; 
}
Почему закомментированный вариант тоже будет компилироваться? (т.е. почему не нужно <double, double>. Из-за auto?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2013, 23:06
Ответы с готовыми решениями:

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами».
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис)
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не плодить много тем,...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) количество элементов...

Шаблоны в C++
Доброго времени суток! Начал разбираться что такое шаблон и с чем его едят. Загуглил, вставил...

15
1454 / 791 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.09.2013, 23:21 2
При чем здесь auto, типы параметров шаблона выводятся от фактических аргументов функции, можно писать так и так.

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
template<typename T>
T func1(T t) {return t;}
 
template<typename T, typename U>
T func2(U u) {return u;}
 
int main()
{
   func1(5); //Ok
   func1<int>(5); //Ok
   func1<double>(5); //Ok
 
   //func2(5); //Error, невозможно вывести тип T
   func2<double>(5); //Ok
   func2<double, int>(5); //Ok
 
   return 0;
}
1
414 / 410 / 95
Регистрация: 06.10.2011
Сообщений: 832
11.09.2013, 23:22 3
повтор
0
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
11.09.2013, 23:26  [ТС] 4
Цитата Сообщение от DiffEreD Посмотреть сообщение
типы параметров шаблона выводятся от фактических аргументов функции
а почему тогда в этом примере нужно обязательно указать шаблонный параметр в явном виде?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct A 
{ 
    struct B 
    { 
        int value; 
    } b; 
}; 
 
template<typename T> 
void func(typename T::B b) 
{ 
    std::cout << b.value; 
} 
 
int main(int argc, char * argv[]) 
{ 
    A a = {{5}}; 
    func(a.b);                     // ERROR
}
0
Эксперт С++
4974 / 3082 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
11.09.2013, 23:29 5
Потому что нет такого типа: a.b::B, т.е. в B нет B.
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
11.09.2013, 23:36  [ТС] 6
Цитата Сообщение от castaway Посмотреть сообщение
Потому что нет такого типа: a.b::B, т.е. в B нет B.
Что то этот пример запутанный больно. Я согласен, что нет типа a.b::B. Не пойму только, что значит в B нет B. И не пойму, почему если я напишу func<A>(a.b) код работает.
0
DiffEreD
11.09.2013, 23:37
  #7

Не по теме:

В первом посту шаблон не верен, правильней было бы так:

C++
1
2
3
4
5
template<typename T, typename U>
auto max(const T& t, const U& u) -> typename std::decay<decltype(t > u ? t : u)>::type
{
   return t > u ? t : u;
}

0
Эксперт С++
4974 / 3082 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
11.09.2013, 23:39 8
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
почему если я напишу func<A>(a.b) код работает.
Когда указываешь <A>, получается так: void func(typename A::B b) {}
Все верно.

Цитата Сообщение от gore-lykovoe Посмотреть сообщение
Не пойму только, что значит в B нет B.
Это значит, что в структуре B нет другой структуры B.
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
11.09.2013, 23:46  [ТС] 9
Цитата Сообщение от castaway Посмотреть сообщение
Когда указываешь <A>, получается так: void func(typename A::B b) {}
а почему компилятор не может сам догадаться, что параметром будет A?
0
Эксперт С++
4974 / 3082 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
11.09.2013, 23:47 10
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
а почему компилятор не может сам догадаться, что параметром будет A?
Потому что ты явно указываешь a.b
Попробуй указать просто a
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
11.09.2013, 23:49  [ТС] 11
Цитата Сообщение от castaway Посмотреть сообщение
Попробуй указать просто a
void func(T::B): не удается составить аргумент шаблон для "T"
0
1454 / 791 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.09.2013, 23:55 12
Может стоит переписать шаблон:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct A
{
    struct B
    {
        int value;
    } b;
};
 
template<typename T>
void func(T t)
{
    std::cout << t.value << std::endl;
}
 
int main()
{
   A a = {{5}};
   func(a.b); //Ok
   func<A::B>(a.b); //Ok
 
   return 0;
}
0
Olivеr
11.09.2013, 23:55
  #13

Не по теме:

Цитата Сообщение от DiffEreD Посмотреть сообщение

Не по теме:

В первом посту шаблон не верен, правильней было бы так:

C++
1
2
3
4
5
template<typename T, typename U>
auto max(const T& t, const U& u) -> typename std::decay<decltype(t > u ? t : u)>::type
{
   return t > u ? t : u;
}

ну а вдруг ТСу нужна ссылка, а не копия?

0
Эксперт С++
4974 / 3082 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
11.09.2013, 23:57 14
Соврал.
Так: func( a ); - ты передаешь объект типа A - ошибка
Так: func( a.b ); - ты передаешь объект типа B, в шаблоне получается опять же a.b::B - ошибка, нет такого типа, и тип явно не указан
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
12.09.2013, 00:04  [ТС] 15
Цитата Сообщение от DiffEreD Посмотреть сообщение
Может стоит переписать шаблон
это тестовое задание.
Цитата Сообщение от castaway Посмотреть сообщение
получается опять же a.b::B - ошибка
вообщем до меня дошло в чем прикол, спасибо
0
What a waste!
1604 / 1297 / 179
Регистрация: 21.04.2012
Сообщений: 2,723
12.09.2013, 00:37 16
gore-lykovoe, просто B - зависимый от T тип. А Т вывести неоткуда.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.09.2013, 00:37

шаблоны
помогите с задачей пожалуйста нужно описать шаблон класса для хранения последовательности пар ключ...

шаблоны в си++
кто может сказать где прблема? List.h #ifndef LIST_H #define LIST_H #include&lt;iostream&gt;...

Шаблоны
Здравствуйте не объясните новичку пару аспектов про шаблоны 1)Зачем они нужны 2)Преимущества...

Шаблоны С++
Есть функция Merge из алгоритма сортировки слиянием, она объединяет два массива A и B, результат...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.