Вот понимного начал разбираться с либой, ох и много там полезностей!
Короче смастерил себе макрос для генерации структур 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)
Спасибо.
Здравствуйте, superlexx, Вы писали:
S>Мне кажется, что Вы решаете проблемы не соответствующим им способами (используя голые указатели и поля встроенных типов вместо объектов).
Вы забыли еще отметить, что используются малоинформативные имена и отсутствует комментарии. Но суть-то ведь не в этом
Прошу прощения, в код закралась ошибка.
(эх... сделали бы на 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>
S_>>Но суть-то ведь не в этом
S>Суть в том, что извращения с препроцессором -- крайний вариант, а этот край по-моему не достигнут. Аналогичный вопрос: как забить молотком шуруп в доску, избегая его деформацию? По сути на него отвечать как-то неохото...
Ок. Но вы же всё-таки ответили, хотя и не по теме.
А вообще если пораскинуть мозгами.
Даный мною пример это:
— попытка разобраться с возможностями boost::preprocessor (зачем то эта либа таки существует) Я надеюсь вы не под девизом: "макросы — плохо"
— удобный способ сгенерировать туеву хучу однообразных типов с переменным числом членов
— если дополнить мой макрос то можно и шаблоны так генерить.