Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
1

Частичная компиляция шаблонной функции в зависимости от значения параметра

19.08.2013, 14:33. Показов 914. Ответов 9
Метки нет (Все метки)

Добрый день.
Предположим, есть некоторая шаблонная функция. Нужно сделать так, чтобы в зависимости от значения шаблонного параметра компилировалось либо все ее тело, либо только определенная часть. Смысл примерно такой:
C++
1
2
3
4
5
6
7
8
template<bool b>
void f()
{
   #if b==true
      std::cout<<"condition\n";
   #endif
   std::cout<<"always\n";
}
Естественно, этот код не работает - шаблоны обрабатываются после препроцессора. Но смысл должен быть таков. Не подскажете, как это можно сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2013, 14:33
Ответы с готовыми решениями:

Определение максимального значения в шаблонной функции
Здравствуйте, у меня есть вот такая функция для ввода и проверки на правильность введенных данных и...

Распределить значения по годам в зависимости от параметра
Есть куча домов. У каждого дома рассчитывается параметр описывающий его износ (в баллах). В...

Как определить тип возвращаемого значения шаблонной функции по типу итератора (не auto)?
Здравствуйте. Есть шаблонная функция (например, суммирования). Входные значения два итератора --...

Исследовать совместность системы в зависимости от значения параметра а
Добрый день! Второй день ни спать, ни есть не могу. А все потому, что не удается дойти до хода...

9
В астрале
Эксперт С++
8032 / 4789 / 655
Регистрация: 24.06.2010
Сообщений: 10,558
19.08.2013, 14:37 2
SFINAE в помощь. Или же просто специализациями.
Например со SFINAE
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<bool b>
typename std::enable_if<b, void>::type f_helper()
{
   std::cout << "condition" << std::endl;
}
 
template<bool b>
typename std::enable_if<!b, void>::type f_helper()
{
}
 
template<bool b>
void f()
{
   f_helper<b>();
   std::cout << "always" << std::endl;
}
Специализации

C++
1
2
3
4
5
6
7
8
9
10
11
12
template<bool b> void f_helper() {}
template<> void f_helper<true>()
{
   std::cout << "condition" << std::endl;
}
 
template<bool b>
void f()
{
   f_helper<b>();
   std::cout << "always" << std::endl;
}
1
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
19.08.2013, 14:39  [ТС] 3
ForEveR, так и сделал поначалу. Просто не хотелось плодить вспомогательных функций)
0
В астрале
Эксперт С++
8032 / 4789 / 655
Регистрация: 24.06.2010
Сообщений: 10,558
19.08.2013, 14:42 4
Gorillych, Никак. Это этап компиляции. В С++ нету static if.
1
Эксперт С++
5025 / 2604 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.08.2013, 14:44 5
Цитата Сообщение от Gorillych Посмотреть сообщение
Просто не хотелось плодить вспомогательных функций
Тогда на самом деле простой специализацией:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
template <bool>
void f()
{
   std::cout<<"condition\n";
   std::cout<<"always\n";
}
 
template <>
void f<false>()
{
   std::cout<<"always\n";
}
 
int main() {
    f<true>(); 
    f<false>();
}
0
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
19.08.2013, 14:45  [ТС] 6
fasked, это если в функции один параметр шаблонный. А если несколько? Частично специализировать функцию нельзя.
0
В астрале
Эксперт С++
8032 / 4789 / 655
Регистрация: 24.06.2010
Сообщений: 10,558
19.08.2013, 14:46 7
Gorillych, Структурку вспомогательную бабахнуть.
1
What a waste!
1592 / 1290 / 174
Регистрация: 21.04.2012
Сообщений: 2,702
19.08.2013, 14:59 8
Цитата Сообщение от Gorillych Посмотреть сообщение
fasked, это если в функции один параметр шаблонный. А если несколько?
Тогда enable_if
1
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
19.08.2013, 15:04  [ТС] 9
Цитата Сообщение от ForEveR Посмотреть сообщение
Gorillych, Структурку вспомогательную бабахнуть.
ForEveR, точно))) Просто же все оказалось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<bool b>
struct condition
{
    template<int a>
    static void f(){std::cout<<"a = "<<a<<" true";}
};
 
template<>
struct condition<false>
{
    template<int a>
    static void f(){std::cout<<"a = "<<a<<" false";}
};
 
int main()
{  
    condition<true>::f<5>();
    condition<false>::f<11>();
}
В общем, надо выспаться
0
gray_fox
19.08.2013, 16:14     Частичная компиляция шаблонной функции в зависимости от значения параметра
  #10

Не по теме:

Gorillych, не знаю, то ли, что нужно, в качестве идеи

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<bool Condition, typename F>
constexpr typename std::enable_if<Condition>::type
conditional_call(F && f) noexcept(noexcept(f())) {
   f();
}
 
template<bool Condition, typename F>
constexpr typename std::enable_if<!Condition>::type
conditional_call(F &&) noexcept {}
 
 
template<bool Condition>
void f() {
   // ...
   conditional_call<Condition>([] () {
      // conditional
   });
   // ...
}

1
19.08.2013, 16:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2013, 16:14
Привет! Вот еще темы с ответами:

Вычислить значение выражения в зависимости от значения параметра
Вычислить значение выражения в зависимости от значения параметра. ...

Вычислить определитель матрицы в зависимости от значения параметра
Добрый вечер Прошу проверить меня. Задание, посчитать определитель матрицы в зависимости от...

Функции в зависимости от параметра
хз как точнее описать в общем можно ли сделать чтобы в классе появлялись (становились доступными в...

Найти ранг матрицы в зависимости от значения параметра α
|α 0 -1 2| А=|-2α 0 -2 4| |0 0 α 0| Просто подставить любое значение вместе...


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

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

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