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

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

Восстановить пароль Регистрация
 
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
19.08.2013, 14:33     Частичная компиляция шаблонной функции в зависимости от значения параметра #1
Добрый день.
Предположим, есть некоторая шаблонная функция. Нужно сделать так, чтобы в зависимости от значения шаблонного параметра компилировалось либо все ее тело, либо только определенная часть. Смысл примерно такой:
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";
}
Естественно, этот код не работает - шаблоны обрабатываются после препроцессора. Но смысл должен быть таков. Не подскажете, как это можно сделать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2013, 14:33     Частичная компиляция шаблонной функции в зависимости от значения параметра
Посмотрите здесь:

C++ Написать функцию, которая в зависимости от значения первого параметра возвращает количество отрицательных или положительных чисел призвольного массива
C++ Написать функцию, которая сортирует массив по возрастанию или по убыванию, в зависимости от третьего параметра функции.
C++ Вычислить и вывести на экран значения функции в зависимости от входного значения Х
C++ Создание шаблонной функции
Объявление шаблонной функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
}
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
19.08.2013, 14:39  [ТС]     Частичная компиляция шаблонной функции в зависимости от значения параметра #3
ForEveR, так и сделал поначалу. Просто не хотелось плодить вспомогательных функций)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.08.2013, 14:42     Частичная компиляция шаблонной функции в зависимости от значения параметра #4
Gorillych, Никак. Это этап компиляции. В С++ нету static if.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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>();
}
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
19.08.2013, 14:45  [ТС]     Частичная компиляция шаблонной функции в зависимости от значения параметра #6
fasked, это если в функции один параметр шаблонный. А если несколько? Частично специализировать функцию нельзя.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.08.2013, 14:46     Частичная компиляция шаблонной функции в зависимости от значения параметра #7
Gorillych, Структурку вспомогательную бабахнуть.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
19.08.2013, 14:59     Частичная компиляция шаблонной функции в зависимости от значения параметра #8
Цитата Сообщение от Gorillych Посмотреть сообщение
fasked, это если в функции один параметр шаблонный. А если несколько?
Тогда enable_if
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>();
}
В общем, надо выспаться
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2013, 16:14     Частичная компиляция шаблонной функции в зависимости от значения параметра
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
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
   });
   // ...
}

Yandex
Объявления
19.08.2013, 16:14     Частичная компиляция шаблонной функции в зависимости от значения параметра
Ответ Создать тему
Опции темы

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