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

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

Войти
Регистрация
Восстановить пароль
 
AGluk
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 4
#1

Выбор кода для компиляции на основании сравнения параметров шаблона - C++

05.08.2011, 15:18. Просмотров 638. Ответов 10
Метки нет (Все метки)

Здравствуйте.
Помогите, пожалуйста, разобраться со следующим вопросом. Необходимо выбирать компилируемый код в зависимости от какого-либо условия. Для примера рассмотрим следующую функцию:

Код
template <int p> int MyFunc()
{
    #if (p < 0)
        return -1;
    #elif (p > 0)
        return 1;
    #else
        return 0;
    #endif
}
С какими бы параметрами шаблона я не вызывал данную функцию я всегда попадаю в ветку #else.
Поиск в интернете не привел к положительным результатам. Возможно я чего-то недопонимаю в работе препроцессора или ошибаюсь в какой-нибудь ерунде.
Большое спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2011, 15:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выбор кода для компиляции на основании сравнения параметров шаблона (C++):

Выбор кода при компиляции - C++
Здравствуйте! Столкнулся с почти аналогичной проблемой, как и описанная в данной статье: ...

Выбор значения для шаблона, bool отделить от std::is_integral - C++
Подскажите, как возвращать тип bool , через std::is_integral выдаёт предупреждение при использовании bool в входных параметрах класса, а...

Компилятор путает знаки шаблона и оператор сравнения - C++
В строчке std::priority_queue &lt; Corridor &gt; active; Ошибка no match for 'operator&lt;' Corridor.h

Исправить ошибку компиляции "для использования класса шаблон требуется список аргументов шаблона" - C++
Решил создать класс List для задания двусвязного списка, и в самом начале компилятор начал ругаться на шаблон класса: error C2955:...

Макрос с переменным числом параметров для сокращения кода - C++
Добрый день. Есть некоторый класс/структура/функция... где присутствует такая запись: using Car = typename MyClass::Car; using Bus =...

Перехват значений параметров шаблона - C++
Вопрос, собственно, в развитие этой темы - http://www.cyberforum.ru/cpp-beginners/thread930128.html Есть вот такой код: namespace...

10
LosAngeles
Заблокирован
05.08.2011, 15:22 #2
боюсь тебя огорчить, но макросы все раскрываются до инстанцирования и вобще до того как кампилятор просматривает шаблон. Это ж препроцессорные директивы
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
05.08.2011, 15:27 #3
Цитата Сообщение от AGluk Посмотреть сообщение
Возможно я чего-то недопонимаю в работе препроцессора
Возможно. Препроцессор обрабатывает программу до компилятора. И, соответственно, до инстанцирования шаблона. Да и вообще, для препроцессора не существует переменных (даже константных), поэтому он рассматривает p как необъявленный идентификатор (поскольку ранее не было директивы #define p)

Добавлено через 1 минуту
AGluk, используй там обычный if, компилятор уберёт ненужные проверки, так как p константа.
1
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
05.08.2011, 15:32 #4
Цитата Сообщение от grizlik78 Посмотреть сообщение
Возможно. Препроцессор обрабатывает программу до компилятора. И, соответственно, до инстанцирования шаблона. Да и вообще, для препроцессора не существует переменных (даже константных), поэтому он рассматривает p как необъявленный идентификатор (поскольку ранее не было директивы #define p)

Добавлено через 1 минуту
AGluk, используй там обычный if, компилятор уберёт ненужные проверки, так как p константа.
из кода точно не исключит, в отличии от припрацессорного=)
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
05.08.2011, 15:41 #5
Цитата Сообщение от silentnuke Посмотреть сообщение
из кода точно не исключит, в отличии от припрацессорного=)
Исключит, если хотя бы какая-то оптимизация включена. При отключённой оптимизации не уверен.

Добавлено через 6 минут
GCC даже с -O0 исключает.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
05.08.2011, 15:41 #6
Цитата Сообщение от grizlik78 Посмотреть сообщение
Исключит, если хотя бы какая-то оптимизация включена
Исключит ПОСЛЕ компиляции. Если части кода не компилируемы, то не скомпилирует и не исключит.

Цитата Сообщение от AGluk Посмотреть сообщение
Помогите
Сделай глабальное определение макроса и условно компилируй код на основании его значения.
C++
1
2
3
4
5
6
7
8
9
#define P 1
void MyFunc()
{
#if p <0
...
#else
...
#endif
}
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
05.08.2011, 15:47 #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
Исключит ПОСЛЕ компиляции. Если части кода не компилируемы, то не скомпилирует и не исключит.
Разумеется. Кто бы спорил.
0
AGluk
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 4
05.08.2011, 16:01  [ТС] #8
Цитата Сообщение от grizlik78 Посмотреть сообщение
используй там обычный if, компилятор уберёт ненужные проверки, так как p константа.
Всем большое спасибо за оперативную помощь!
Надеюсь как сказал grizlik78, компилятор действительно уберет ненужные проверки констант. Это, к сожалению, можно проверить только посмотрев ассемблерный код, а я в ассемблере не силен.
Но я помню ставил опыты путем измерения скорости выполнения функции, и компилятор там показал себя с очень и очень "умной" стороны. Так что исключение сравнения констант он наверняка делает при оптимизации. Я что-то как-то и забыл совсем про это.
Еще раз всем большое спасибо!
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
05.08.2011, 16:04 #9
Ну я проверил по ассемблерному коду на 2 компиляторах.
GCC 4.5 всегда убирал, VC2008 без оптимизации не убирает, а с /O2 или /O1 убирает.
Я бы ещё inline к такой функции добавил.
0
Сыроежка
Заблокирован
05.08.2011, 16:09 #10
Цитата Сообщение от AGluk Посмотреть сообщение
Всем большое спасибо за оперативную помощь!
Надеюсь как сказал grizlik78, компилятор действительно уберет ненужные проверки констант. Это, к сожалению, можно проверить только посмотрев ассемблерный код, а я в ассемблере не силен.
Но я помню ставил опыты путем измерения скорости выполнения функции, и компилятор там показал себя с очень и очень "умной" стороны. Так что исключение сравнения констант он наверняка делает при оптимизации. Я что-то как-то и забыл совсем про это.
Еще раз всем большое спасибо!
В вашем примере препроцессор рассматривает 'p' как препроцессорную константу. Так как она не объявлена явно, то ее значение равно нулю. Именно поэтому у вас всегда управление передается на ветку 'else'.
Препроцессор убирает код, который не удовлетворяет условию препроцессорной директивы #if-#else. Более того если, допустим, условие #if верное, то препроцессор даже не проверяет наличие ошибок в условие '#else', полностью ее игнорируя. И к оптимизации это никакого отношения не имеет. Это имеет отношение к работе препроцессора.
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
05.08.2011, 16:11 #11
Сыроежка, а всё обсуждение почитать? Или хотя бы #3
0
05.08.2011, 16:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2011, 16:11
Привет! Вот еще темы с ответами:

Переменное число параметров шаблона - C++
Здоровеньки булы. Не уверен, что название темы точно отражает суть вопроса. Есть заготовка шаблонного делегата, параметры которого -...

Ошибка компиляции при реализации класса-шаблона - C++
Не могу понять почему компилятор ругается. Помогите разобраться. #include &lt;iostream&gt; using namespace std; template...

Явная специализация шаблона функции - ошибка на этапе компиляции - C++
Всем привет, читаю книгу С. Прата и пытаюсь скомпилировать шаблонную функцию с явной специализацией, но на этапе компиляции вылезают...

Выбор нужной ячейки, на основании двух параметров и отображение её имени - MS Excel
Привет, ребзя! Есть проблема. Ссылки на похожие можете не кидать, всё просмотрел, подобного не нашел. Есть ТРИ параметра в...


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

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

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