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

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

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

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

12.07.2014, 01:11. Просмотров 349. Ответов 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++
Вычислить в зависимости от условия C++
C++ Различное поведение конструктора шаблонного класса в зависимости от типа параметра
Вычислить в зависимости от условия (switch) C++
C++ Присвоить значение в зависимости от условия
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1252 / 1135 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 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
1425 / 762 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.07.2014, 01:22  [ТС]     Вызов шаблонного метода в зависимости от условия #3
Я хочу в ран тайме.
gray_fox
What a waste!
 Аватар для gray_fox
1252 / 1135 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
12.07.2014, 01:24     Вызов шаблонного метода в зависимости от условия #4
Цитата Сообщение от DiffEreD Посмотреть сообщение
Я хочу в ран тайме.
Тогда никак, нельзя скомпилировать то, чего нету.
DiffEreD
 Аватар для DiffEreD
1425 / 762 / 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
1252 / 1135 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
12.07.2014, 01:53     Вызов шаблонного метода в зависимости от условия #6
DiffEreD, сработает; но это же не "в рантайме" ни разу...
DiffEreD
 Аватар для DiffEreD
1425 / 762 / 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!
 Аватар для gray_fox
1252 / 1135 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
12.07.2014, 02:11     Вызов шаблонного метода в зависимости от условия #8
Цитата Сообщение от DiffEreD Посмотреть сообщение
Поправочка:
Да, с примером enable_if я налажал)
zarko97
230 / 11 / 0
Регистрация: 11.10.2015
Сообщений: 62
09.01.2017, 17:50     Вызов шаблонного метода в зависимости от условия #9
а не проще ли будет просто в качестве второго параметра передать std::true_type / std::false_type
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6227 / 3472 / 424
Регистрация: 29.11.2010
Сообщений: 9,178
09.01.2017, 17:53     Вызов шаблонного метода в зависимости от условия #10
Цитата Сообщение от zarko97 Посмотреть сообщение
а не проще ли будет просто в качестве второго параметра передать std::true_type / std::false_type
Оно и передаётся, только вычисляется с помощью магии шаблонов, а не ручным обезьянним трудом.
zarko97
230 / 11 / 0
Регистрация: 11.10.2015
Сообщений: 62
09.01.2017, 18:07     Вызов шаблонного метода в зависимости от условия #11
ну тогда уже если на то пошло
C++
1
std::enable_if_t<has_front<T>::value>
Добавлено через 1 минуту
вроде и от std::true_type / std::false_type эффект будет тот же, для чего подобные конструкции городить нужно...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2017, 18:12     Вызов шаблонного метода в зависимости от условия
Еще ссылки по теме:

Вынести реализацию шаблонного метода в cpp C++
C++ Ошибка в вычислении z в зависимости от условия
Функция как аргумент шаблонного метода класса C++
Ошибка в определении шаблонного метода C++
Реализация шаблонного метода с переменным числом параметров C++

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1252 / 1135 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
09.01.2017, 18:12     Вызов шаблонного метода в зависимости от условия #12
zarko97, true_type/false_type тогда надо будет явно указывать при вызове функции в том или ином виде; задача ТС была получить вывод реализации на основе статического типа компилятором.
Yandex
Объявления
09.01.2017, 18:12     Вызов шаблонного метода в зависимости от условия
Ответ Создать тему
Опции темы

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