Подстановка переменной с помощью макроса
От: FreshMeat Россия http://www.rsdn.org
Дата: 24.10.04 09:01
Оценка:
Несложный вопрос, но что-то лыжи не едут
Какой должна быть реализация макроса
#define FLAG_INSERTER( IS_FLAG_NEEDED )

чтобы передаче TRUE, он разворачивался в bool flag,
при передаче FALSE не производилось никаких действий?
Хорошо там, где мы есть! :)
Re: Подстановка переменной с помощью макроса
От: yxiie Украина www.enkord.com
Дата: 24.10.04 10:47
Оценка: 36 (3)
Здравствуйте, 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]: Подстановка переменной с помощью макроса
От: yxiie Украина www.enkord.com
Дата: 24.10.04 10:49
Оценка:
опс, тег [ccode] с [b] попутал. модераторы — подправьте плиз.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Подстановка переменной с помощью макроса
От: Кодт Россия  
Дата: 25.10.04 10:39
Оценка: 30 (4)
Здравствуйте, 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 категорий: те кто понимают двоичное исчисление и тех кто не понимает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.