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

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

Восстановить пароль Регистрация
 
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
11.09.2013, 23:06     Шаблоны C++11 #1
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?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2013, 23:06     Шаблоны C++11
Посмотрите здесь:

шаблоны C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». C++
Шаблоны в C++ C++
Шаблоны C++
C++ Шаблоны
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.09.2013, 23:21     Шаблоны C++11 #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;
}
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
11.09.2013, 23:22     Шаблоны C++11 #3
повтор
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
11.09.2013, 23:26  [ТС]     Шаблоны C++11 #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
}
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
11.09.2013, 23:29     Шаблоны C++11 #5
Потому что нет такого типа: a.b::B, т.е. в B нет B.
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
11.09.2013, 23:36  [ТС]     Шаблоны C++11 #6
Цитата Сообщение от castaway Посмотреть сообщение
Потому что нет такого типа: a.b::B, т.е. в B нет B.
Что то этот пример запутанный больно. Я согласен, что нет типа a.b::B. Не пойму только, что значит в B нет B. И не пойму, почему если я напишу func<A>(a.b) код работает.
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;
}

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

Цитата Сообщение от gore-lykovoe Посмотреть сообщение
Не пойму только, что значит в B нет B.
Это значит, что в структуре B нет другой структуры B.
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
11.09.2013, 23:46  [ТС]     Шаблоны C++11 #9
Цитата Сообщение от castaway Посмотреть сообщение
Когда указываешь <A>, получается так: void func(typename A::B b) {}
а почему компилятор не может сам догадаться, что параметром будет A?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
11.09.2013, 23:47     Шаблоны C++11 #10
Цитата Сообщение от gore-lykovoe Посмотреть сообщение
а почему компилятор не может сам догадаться, что параметром будет A?
Потому что ты явно указываешь a.b
Попробуй указать просто a
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
11.09.2013, 23:49  [ТС]     Шаблоны C++11 #11
Цитата Сообщение от castaway Посмотреть сообщение
Попробуй указать просто a
void func(T::B): не удается составить аргумент шаблон для "T"
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.09.2013, 23:55     Шаблоны C++11 #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;
}
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;
}

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

castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
11.09.2013, 23:57     Шаблоны C++11 #14
Соврал.
Так: func( a ); - ты передаешь объект типа A - ошибка
Так: func( a.b ); - ты передаешь объект типа B, в шаблоне получается опять же a.b::B - ошибка, нет такого типа, и тип явно не указан
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
12.09.2013, 00:04  [ТС]     Шаблоны C++11 #15
Цитата Сообщение от DiffEreD Посмотреть сообщение
Может стоит переписать шаблон
это тестовое задание.
Цитата Сообщение от castaway Посмотреть сообщение
получается опять же a.b::B - ошибка
вообщем до меня дошло в чем прикол, спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 00:37     Шаблоны C++11
Еще ссылки по теме:

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны C++
C++ Шаблоны в C++
Шаблоны C++

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
12.09.2013, 00:37     Шаблоны C++11 #16
gore-lykovoe, просто B - зависимый от T тип. А Т вывести неоткуда.
Yandex
Объявления
12.09.2013, 00:37     Шаблоны C++11
Ответ Создать тему
Опции темы

Текущее время: 14:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru