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

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

Войти
Регистрация
Восстановить пароль
 
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
#1

Вызов шаблонного метода в зависимости от условия - C++

12.07.2014, 01:11. Просмотров 394. Ответов 11
Метки нет (Все метки)

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
38
39
40
41
42
43
44
45
#include <iostream>
#include <stack>
#include <queue>
#include <type_traits>
 
template<typename T>
class has_front {
 
   template<typename R>
   struct checker {};
 
   template<typename S>
   static std::false_type check(...);
 
   template<typename S>
   static std::true_type check(checker<decltype(std::declval<S>().front())> *);
 
public:
   static constexpr bool value = std::is_same<decltype(check<T>(nullptr)), std::true_type>::value;
};
 
template <typename T>
void print(T conteiner, bool has_front)
{
   if (has_front) {
      std::cout << "front method enable.\n";
      std::cout << conteiner.front() << "\n";
   }
   else {
      std::cout << "front method disable.\n";
      std::cout << conteiner.top() << "\n";
   }
}
 
 
int main()
{
   std::stack<int>     st{ {1,2,3,4} };
   std::queue<double>  qu{ {1.1, 2.2, 3.3, 4.4} };
   print(st, has_front<decltype(st)>::value);
   print(qu, has_front<decltype(qu)>::value);
 
   system("pause");
   return 0;
}
Что то я не соображу как это сделать.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2014, 01:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов шаблонного метода в зависимости от условия (C++):

Вызов метода у шаблонного поля, шаблонного класса - C++
Пытаюсь разобраться с шаблонами- задача создать шаблонный класс, у которого есть шаблонное поле. и затем вызывать метод у этого поля. ...

Ошибка в определении шаблонного метода - C++
Подскажите пожалуйста, что делаю не так в определении шаблонного метода. Вот код: // test.cpp #include &lt;iostream&gt; #include...

Вызов конструктора шаблонного класса - C++
Есть шаблонный класс стек, он является полем в классе Express, но компилятор выдает ошибку &quot; Ошибка 1 error C2614: Express: недопустимая...

Вынести реализацию шаблонного метода в cpp - C++
Есть класс с публичным шаблонным методом. В заголовочном файле определен этот метод, а в cpp файле его реализация. Этот метод хочу...

Аргументы шаблонного метода как объекты - C++
Не могу решить одну задачу. вот три класса class win {}; class obj1 {}; class obj2 {};

Функция как аргумент шаблонного метода класса - C++
Пытаюсь передать функцию для сравнения в сортировке слиянием, но что-то не получается. Подскажите, как исправить этот код, чтобы сортировка...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
12.07.2014, 01:20 #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
DiffEreD, во время компиляции? enable_if
C++
1
2
3
4
5
template<typename T, typename = typename std::enable_if<has_front<T>::value>::type>
void print( /* ... */ ) { /* ... */ }
 
template<typename T, typename = typename std::enable_if<!has_front<T>::value>::type>
void print( /* ... */ ) { /* ... */ }
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.07.2014, 01:22  [ТС] #3
Я хочу в ран тайме.
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
12.07.2014, 01:24 #4
Цитата Сообщение от DiffEreD Посмотреть сообщение
Я хочу в ран тайме.
Тогда никак, нельзя скомпилировать то, чего нету.
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.07.2014, 01:48  [ТС] #5
Ясно, просто тогда придется дублировать один и тот же код два раза.

Добавлено через 15 минут
А такая конструкция тоже никак не заработает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<typename T, typename = typename std::enable_if<has_front<T>::value>::type>
typename T::const_reference  method(T& t) {
   return t.front();
}
 
template<typename T, typename = typename std::enable_if<!has_front<T>::value>::type>
typename T::const_reference  method(T& t) {
   return t.top();
}
 
template <typename T>
void print(T conteiner)
{
   std::cout <<  method<T>(conteiner) << "\n";
}
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
12.07.2014, 01:53 #6
DiffEreD, сработает; но это же не "в рантайме" ни разу...
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.07.2014, 02:01  [ТС] #7
Поправочка:
C++
1
2
3
4
5
6
7
8
9
template<typename T>
typename T::const_reference  method(T& t, typename std::enable_if<has_front<T>::value>::type* = 0) {
   return t.front();
}
 
template<typename T>
typename T::const_reference  method(T& t, typename std::enable_if<!has_front<T>::value>::type* = 0) {
   return t.top();
}
Все разобрался.
Я просто сначала думал что моя предыдущая функция работать должна только в рантайме.
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
12.07.2014, 02:11 #8
Цитата Сообщение от DiffEreD Посмотреть сообщение
Поправочка:
Да, с примером enable_if я налажал)
zarko97
276 / 36 / 0
Регистрация: 11.10.2015
Сообщений: 369
09.01.2017, 17:50 #9
а не проще ли будет просто в качестве второго параметра передать std::true_type / std::false_type
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
09.01.2017, 17:53 #10
Цитата Сообщение от zarko97 Посмотреть сообщение
а не проще ли будет просто в качестве второго параметра передать std::true_type / std::false_type
Оно и передаётся, только вычисляется с помощью магии шаблонов, а не ручным обезьянним трудом.
zarko97
276 / 36 / 0
Регистрация: 11.10.2015
Сообщений: 369
09.01.2017, 18:07 #11
ну тогда уже если на то пошло
C++
1
std::enable_if_t<has_front<T>::value>
Добавлено через 1 минуту
вроде и от std::true_type / std::false_type эффект будет тот же, для чего подобные конструкции городить нужно...
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
09.01.2017, 18:12 #12
zarko97, true_type/false_type тогда надо будет явно указывать при вызове функции в том или ином виде; задача ТС была получить вывод реализации на основе статического типа компилятором.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2017, 18:12
Привет! Вот еще темы с ответами:

Реализация шаблонного метода с переменным числом параметров - C++
Добрый день! Не могу придумать, как реализовать метод, позволяющий принимать переменное кол-во аргументов. Чтобы понять что именно...

Перегрузка оператора шаблонного класса в зависимости от типа - C++
Как заставить шаблон различать тип переменной которую ему передают? Пробую определить через type_traits, но не выходит - не компилируется....

Явная специализация метода для типа шаблонного класса - C++
Добрый вечер, уважаемые знатоки! :) Хочу задать вопрос по созданию шаблонов. В общем, пусть у меня есть шаблон некоторого класса: ...

Различное поведение конструктора шаблонного класса в зависимости от типа параметра - C++
Здравствуйте. Возникла проблема - при попытке изменить поведение конструктора шаблонного класса (структуры) в зависимости от типа...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.01.2017, 18:12
Ответ Создать тему
Опции темы

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