С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
#1

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

19.08.2013, 14:33. Просмотров 487. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2013, 14:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Частичная компиляция шаблонной функции в зависимости от значения параметра (C++):

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

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

Написать функцию, которая в зависимости от значения первого параметра возвращает количество отрицательных или положительных чисел призвольного массива - C++
Написать функцию, которая в зависимости от значения первого параметра (символ + или – ) возвращает количество отрицательных или...

В зависимости от значения некоторого выражения вычислить значения функции y(x), определенной на отрезке [a;b], - C++
Добрый вечер, помогите пожалуйста решить задачку С++ на тему&quot;Сочетания циклов и разветвлений&quot; В зависимости от значения некоторого...

Вычислить и вывести на экран значения функции в зависимости от входного значения Х - C++
Вычислить и вывести на экран значения функции в зависимости от входного значения Х. заранее благодарю :sorry:

Написать функцию, которая сортирует массив по возрастанию или по убыванию, в зависимости от третьего параметра функции. - C++
Доброго времени суток! У меня возникла некоторая проблема в написании кода для задания: Дан массив чисел размерностью 10 элементов....

9
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
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
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
19.08.2013, 14:39  [ТС] #3
ForEveR, так и сделал поначалу. Просто не хотелось плодить вспомогательных функций)
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.08.2013, 14:42 #4
Gorillych, Никак. Это этап компиляции. В С++ нету static if.
1
fasked
Эксперт С++
4952 / 2532 / 180
Регистрация: 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
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
19.08.2013, 14:45  [ТС] #6
fasked, это если в функции один параметр шаблонный. А если несколько? Частично специализировать функцию нельзя.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.08.2013, 14:46 #7
Gorillych, Структурку вспомогательную бабахнуть.
1
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
19.08.2013, 14:59 #8
Цитата Сообщение от Gorillych Посмотреть сообщение
fasked, это если в функции один параметр шаблонный. А если несколько?
Тогда enable_if
1
Gorillych
14 / 14 / 1
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2013, 16:14
Привет! Вот еще темы с ответами:

Составить программу вычисления функции y в зависимости от значения а - C++
помогите решить

Почему тип входящего параметра функции может отличаться от типа возвращаемого значения? - C++
Зачем здесь указываеться другой тип данных: double &amp;change_it(int i); Весь код: using namespace std; double...

Дополнить код вычисления значения в зависимости от выбранной функции - C++
Здравствуйте, прошу помочь дополнить код чтобы найти y. Ступор на синус в кубе, и квадратных скобках. Не знаю как грамотно написать. Нашел...

Итераторы в шаблонной функции - C++
Здравствуйте, пишу программу, в ознакомительных целях с шаблонными функциями. У меня есть функция, вычисляющая среднее арифметическое. Как...


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

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

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