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

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

Восстановить пароль Регистрация
 
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.07.2014, 01:11     Вызов шаблонного метода в зависимости от условия #1
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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.07.2014, 01:22  [ТС]     Вызов шаблонного метода в зависимости от условия #3
Я хочу в ран тайме.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
12.07.2014, 01:24     Вызов шаблонного метода в зависимости от условия #4
Цитата Сообщение от DiffEreD Посмотреть сообщение
Я хочу в ран тайме.
Тогда никак, нельзя скомпилировать то, чего нету.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
12.07.2014, 01:53     Вызов шаблонного метода в зависимости от условия #6
DiffEreD, сработает; но это же не "в рантайме" ни разу...
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 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();
}
Все разобрался.
Я просто сначала думал что моя предыдущая функция работать должна только в рантайме.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2014, 02:11     Вызов шаблонного метода в зависимости от условия
Еще ссылки по теме:

Вычислить в зависимости от условия (switch) C++
Вызов метода у шаблонного поля, шаблонного класса C++
C++ Присвоить значение в зависимости от условия

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
12.07.2014, 02:11     Вызов шаблонного метода в зависимости от условия #8
Цитата Сообщение от DiffEreD Посмотреть сообщение
Поправочка:
Да, с примером enable_if я налажал)
Yandex
Объявления
12.07.2014, 02:11     Вызов шаблонного метода в зависимости от условия
Ответ Создать тему
Опции темы

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