Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
#1

Шаблоны C++11 - C++

11.09.2013, 23:06. Просмотров 766. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2013, 23:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны C++11 (C++):

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». - C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

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

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

Шаблоны C++ - C++
Написал template на С++, но он нифига не компилица, пишет мол типа не могу string в int преобразовать в строчке int out_param = (int)param;...

Шаблоны - C++
Я разбираюсь с ООП в С++ и застрял на шаблонах, будьте добры приведите пример кода, к примеру там.... вес машины и шаблон,(ну вообщем на...

Шаблоны - C++
// ConsoleApplication176.cpp : Defines the entry point for the console application. // template&lt;class type&gt; struct link { type...

15
DiffEreD
1435 / 772 / 95
Регистрация: 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
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
11.09.2013, 23:22 #3
повтор
0
gore-lykovoe
32 / 32 / 1
Регистрация: 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
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
11.09.2013, 23:29 #5
Потому что нет такого типа: a.b::B, т.е. в B нет B.
1
gore-lykovoe
32 / 32 / 1
Регистрация: 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
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
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
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
11.09.2013, 23:46  [ТС] #9
Цитата Сообщение от castaway Посмотреть сообщение
Когда указываешь <A>, получается так: void func(typename A::B b) {}
а почему компилятор не может сам догадаться, что параметром будет A?
0
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
11.09.2013, 23:47 #10
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
а почему компилятор не может сам догадаться, что параметром будет A?
Потому что ты явно указываешь a.b
Попробуй указать просто a
1
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
11.09.2013, 23:49  [ТС] #11
Цитата Сообщение от castaway Посмотреть сообщение
Попробуй указать просто a
void func(T::B): не удается составить аргумент шаблон для "T"
0
DiffEreD
1435 / 772 / 95
Регистрация: 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
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
11.09.2013, 23:57 #14
Соврал.
Так: func( a ); - ты передаешь объект типа A - ошибка
Так: func( a.b ); - ты передаешь объект типа B, в шаблоне получается опять же a.b::B - ошибка, нет такого типа, и тип явно не указан
1
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
12.09.2013, 00:04  [ТС] #15
Цитата Сообщение от DiffEreD Посмотреть сообщение
Может стоит переписать шаблон
это тестовое задание.
Цитата Сообщение от castaway Посмотреть сообщение
получается опять же a.b::B - ошибка
вообщем до меня дошло в чем прикол, спасибо
0
12.09.2013, 00:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 00:04
Привет! Вот еще темы с ответами:

Шаблоны - C++
ругается на строку &quot;friend class List&lt;T&gt;;&quot;, вот что пишет: 1&gt;c:\users\slava\documents\visual studio...

Шаблоны - C++
Когда разделяю реализацию и прототип шаблонной в функции по разным файлам (*.h и *.cpp) происходит ошибка линковки... Я так понимаю, делать...

Шаблоны С++ - C++
template &lt;typename T_sizeCapacity&gt; class SomeClass { public: T_sizeCacity size; }; Как сделать чтобы T_sizeCapacity мог быть...

Шаблоны - C++
Не пойму что я неправильно делаю. Как не переделывал, всё равно не получалось. Может кто сможет чем помочь. А задача следующая-надо было...


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

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

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