boost::preprocessor
От: nen777w  
Дата: 14.09.08 23:30
Оценка:
Вот понимного начал разбираться с либой, ох и много там полезностей!
Короче смастерил себе макрос для генерации структур c членами:
Вот:

#include "boost/preprocessor.hpp"

#define _NOP()
#define _UL() _
#define _SC() ;
#define CLASS( name )     class name
#define STRUCT( name )    struct name

#define DECLARE_MEMBER(r, d, mem) \
    BOOST_PP_TUPLE_ELEM(2, 0, mem) BOOST_PP_TUPLE_ELEM(2, 1, mem) _SC()

#define DECLARE_ARG_CONSTRUCT(r, d, arg) \
    BOOST_PP_TUPLE_ELEM(2, 0, arg) BOOST_PP_TUPLE_ELEM(2, 1, arg)_UL() BOOST_PP_EXPR_IF(BOOST_PP_EQUAL(r,d), BOOST_PP_COMMA())

#define DECLARE_ARG_CONSTRUCT_INIT(r, d, arg) \
    BOOST_PP_TUPLE_ELEM(2, 1, arg) ( BOOST_PP_TUPLE_ELEM(2, 1, arg)_UL() ) BOOST_PP_EXPR_IF(BOOST_PP_EQUAL(r,d), BOOST_PP_COMMA())

#define DECLARE_T( lang_type, name, memeber_seq, member_access ) \
    lang_type(name) { \
        name ( \
            BOOST_PP_SEQ_FOR_EACH( DECLARE_ARG_CONSTRUCT, BOOST_PP_SEQ_SIZE(memeber_seq), memeber_seq ) \
        ) : \
        BOOST_PP_SEQ_FOR_EACH( DECLARE_ARG_CONSTRUCT_INIT, BOOST_PP_SEQ_SIZE(memeber_seq), memeber_seq ) \
    {} \
    member_access##: \
        BOOST_PP_SEQ_FOR_EACH( DECLARE_MEMBER , _NOP(), memeber_seq) \
    };
    
#define DEF_TN( t,n ) ((t,n))


Работает это так:
DECLARE_T( STRUCT, some, DEF_TN(int, a) DEF_TN(const char*, b), public )


Раскрывается как:
struct some { some ( int a_ , const char* b_    ) : a ( a_ ) , b ( b_ )    {} public: int a ; const char* b ;   };


Что хотелось бы улучшить так это макрос DEF_TN. Что бы форма записи стала более человечной т.е. DEF_TN( int a ) вместо DEF_TN( int, a)
т.е. избавиться от запятой. Я конечно в чудеса не верю, а перелопатить документацию boost::preprocessor с первого раза конечно сложно, но
может есть макрос который сможет раскрыть
SOME_MACROS(int a)
во что то вроде int, a или (int)(a)

Спасибо.
boost::preprocessor
Re: boost::preprocessor
От: superlexx  
Дата: 15.09.08 08:58
Оценка: -1 :)
Здравствуйте, nen777w, Вы писали:
N> [...]

Мне кажется, что Вы решаете проблемы не соответствующим им способами (используя голые указатели и поля встроенных типов вместо объектов).
Re[2]: boost::preprocessor
От: Sash_xp  
Дата: 15.09.08 09:28
Оценка:
Здравствуйте, superlexx, Вы писали:

S>Мне кажется, что Вы решаете проблемы не соответствующим им способами (используя голые указатели и поля встроенных типов вместо объектов).


Вы забыли еще отметить, что используются малоинформативные имена и отсутствует комментарии. Но суть-то ведь не в этом
Re: boost::preprocessor
От: nen777w  
Дата: 15.09.08 10:32
Оценка:
Прошу прощения, в код закралась ошибка.
(эх... сделали бы на RSDN возможность редактировать свои постинги)

N>
N>#include "boost/preprocessor.hpp"

N>#define _NOP()
N>#define _UL() _
N>#define _SC() ;
N>#define CLASS( name )     class name
N>#define STRUCT( name )    struct name

N>#define DECLARE_MEMBER(r, d, mem) \
N>    BOOST_PP_TUPLE_ELEM(2, 0, mem) BOOST_PP_TUPLE_ELEM(2, 1, mem) _SC()

N>#define DECLARE_ARG_CONSTRUCT(r, d, arg) \
N>    BOOST_PP_TUPLE_ELEM(2, 0, arg) BOOST_PP_TUPLE_ELEM(2, 1, arg)_UL() BOOST_PP_EXPR_IF(BOOST_PP_LESS_EQUAL(r,d), BOOST_PP_COMMA())

N>#define DECLARE_ARG_CONSTRUCT_INIT(r, d, arg) \
N>    BOOST_PP_TUPLE_ELEM(2, 1, arg) ( BOOST_PP_TUPLE_ELEM(2, 1, arg)_UL() ) BOOST_PP_EXPR_IF(BOOST_PP_LESS_EQUAL(r,d), BOOST_PP_COMMA())

N>#define DECLARE_T( lang_type, name, memeber_seq, member_access ) \
N>    lang_type(name) { \
N>        name ( \
N>            BOOST_PP_SEQ_FOR_EACH( DECLARE_ARG_CONSTRUCT, BOOST_PP_SEQ_SIZE(memeber_seq), memeber_seq ) \
N>        ) : \
N>        BOOST_PP_SEQ_FOR_EACH( DECLARE_ARG_CONSTRUCT_INIT, BOOST_PP_SEQ_SIZE(memeber_seq), memeber_seq ) \
N>    {} \
N>    member_access##: \
N>        BOOST_PP_SEQ_FOR_EACH( DECLARE_MEMBER , _NOP(), memeber_seq) \
N>    };
    
N>#define DEF_TN( t,n ) ((t,n))
N>
Re[3]: boost::preprocessor
От: superlexx  
Дата: 15.09.08 10:38
Оценка:
Здравствуйте, Sash_xp, Вы писали:

S_>Но суть-то ведь не в этом ;)


Суть в том, что извращения с препроцессором -- крайний вариант, а этот край по-моему не достигнут. Аналогичный вопрос: как забить молотком шуруп в доску, избегая его деформацию? По сути на него отвечать как-то неохото...
Re[4]: boost::preprocessor
От: nen777w  
Дата: 15.09.08 10:52
Оценка:
S_>>Но суть-то ведь не в этом

S>Суть в том, что извращения с препроцессором -- крайний вариант, а этот край по-моему не достигнут. Аналогичный вопрос: как забить молотком шуруп в доску, избегая его деформацию? По сути на него отвечать как-то неохото...


Ок. Но вы же всё-таки ответили, хотя и не по теме.
А вообще если пораскинуть мозгами.
Даный мною пример это:
— попытка разобраться с возможностями boost::preprocessor (зачем то эта либа таки существует) Я надеюсь вы не под девизом: "макросы — плохо"
— удобный способ сгенерировать туеву хучу однообразных типов с переменным числом членов
— если дополнить мой макрос то можно и шаблоны так генерить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.