Подстановка переменной с помощью макроса
Несложный вопрос, но что-то лыжи не едут
Какой должна быть реализация макроса
#define FLAG_INSERTER( IS_FLAG_NEEDED )
чтобы передаче TRUE, он разворачивался в bool flag,
при передаче FALSE не производилось никаких действий?
Хорошо там, где мы есть! :)
Re: Подстановка переменной с помощью макроса
Здравствуйте, FreshMeat, Вы писали:
FM>Несложный вопрос, но что-то лыжи не едут
FM>Какой должна быть реализация макроса
FM>FM>#define FLAG_INSERTER( IS_FLAG_NEEDED )
FM>
FM>чтобы передаче TRUE, он разворачивался в bool flag,
FM> при передаче FALSE не производилось никаких действий?
#include <boost/preprocessor/if.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/facilities/empty.hpp>
#define RESULT() bool flag;
#define FLAG_INSERTER(IS_FLAG_NEEDED) \
BOOST_PP_IF(BOOST_PP_EQUAL(IS_FLAG_NEEDED, 0), BOOST_PP_EMPTY, RESULT)()
FLAG_INSERTER(1)
FLAG_INSERTER(0)
но нужно передавать не TRUE или FALSE, а 0 или 1.
для TRUE или FALSE извращаться надо
... << RSDN@Home 1.1.3 stable >>
Re[2]: Подстановка переменной с помощью макроса
опс, тег [ccode] с [b] попутал. модераторы — подправьте плиз.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Подстановка переменной с помощью макроса
Здравствуйте, yxiie, Вы писали:
Или, более компактно (без буста)
#include <iostream>
using namespace std;
// специализация, понимаешь
#define Apply_TRUE(macro) macro
#define Apply_FALSE(macro)
// вызов
#define Do(macro2) macro2
#define ApplyIf(value, macro) Do(Apply_##value(macro))
main()
{
ApplyIf(TRUE, cout<<"hello" );
ApplyIf(FALSE, cout<<"world" );
}
Перекуём баги на фичи!
Re[3]: Подстановка переменной с помощью макроса
От:
BacCM
Дата: 25.10.04 12:45
Оценка:
Здравствуйте, Кодт, Вы писали:
К>К>#include <iostream>
К>using namespace std;
К>// специализация, понимаешь
К>#define Apply_TRUE(macro) macro
К>#define Apply_FALSE(macro)
К>// вызов
К>#define Do(macro2) macro2
К>#define ApplyIf(value, macro) Do(Apply_##value(macro))
К>main()
К>{
К> ApplyIf(TRUE, cout<<"hello" );
К> ApplyIf(FALSE, cout<<"world" );
К>}
К>
А чем это лучше такого?
#define Apply_IF_TRUE(macro) macro
#define Apply_IF_FALSE(macro)
main()
{
Apply_IF_TRUE(cout<<"hello" );
Apply_IF_FALSE(cout<<"world" );
}
Если не преследовать чисто академический интерес?
Насколько я понял человек хотел чтобы работало:
ApplyIf(1<5, cout<<"hello" );
ApplyIf(1=5, cout<<"world" );
... Люди делятся на 10 категорий: те кто понимают двоичное исчисление и тех кто не понимает
Re[4]: Подстановка переменной с помощью макроса
От:
Кодт
Дата: 25.10.04 13:17
Оценка:
Здравствуйте, BacCM, Вы писали:
BCM>А чем это лучше такого?
BCM>BCM>#define Apply_IF_TRUE(macro) macro
BCM>#define Apply_IF_FALSE(macro)
BCM>main()
BCM>{
BCM> Apply_IF_TRUE(cout<<"hello" );
BCM> Apply_IF_FALSE(cout<<"world" );
BCM>}
BCM>
BCM>Если не преследовать чисто академический интерес?
Тем, что макро-параметр может быть определён где-то на стороне.
#ifdef _DEBUG
#define IS_DEBUG TRUE
#else
#define IS_DEBUG FALSE
#endif
.........
#define MILESTONE(s) ApplyIfElse( IS_DEBUG, cout<<#s<<endl, (void )0 )
BCM>Насколько я понял человек хотел чтобы работало:
BCM>BCM>ApplyIf(1<5, cout<<"hello" );
BCM>ApplyIf(1=5, cout<<"world" );
BCM>
Ну уж это-то совсем банально: if()...
А для более загадочных случаев, особенно, если при ложном условии ветка не может скомпилироваться — извольте использовать шаблоны со специализациями.
Перекуём баги на фичи!
Re[5]: Подстановка переменной с помощью макроса
От:
BacCM
Дата: 25.10.04 14:40
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, BacCM, Вы писали:
К>Тем, что макро-параметр может быть определён где-то на стороне.
К>К>#ifdef _DEBUG
К>#define IS_DEBUG TRUE
К>#else
К>#define IS_DEBUG FALSE
К>#endif
К>.........
К>#define MILESTONE(s) ApplyIfElse( IS_DEBUG, cout<<#s<<endl, (void )0 )
К>
Более читабельно и очевидно, ИМХО:
#ifdef _DEBUG
#define DO_ANY_DEBUG_MANIPULATIONS DoAny()
#else
#define DO_ANY_DEBUG_MANIPULATIONS (void )0
#endif
Хотя... дело вкуса. Но жизненный опыт показывает, что макросы должны быть как можно более примитивными и простыми
... Люди делятся на 10 категорий: те кто понимают двоичное исчисление и тех кто не понимает
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить