снова здравствуйте!
есть такой код:
#include <boost/preprocessor.hpp>
/***************************************************************************/
#define CONSTRUCT_CONCRETE_proc(name, tuple) /* макровызов обработки последовательности для proc-типов */ \
myproc[name: BOOST_PP_TUPLE_ENUM tuple]
#define CONSTRUCT_CONCRETE_enum(name, tuple) /* макровызов обработки последовательности для enum-типов */ \
myenum[name: BOOST_PP_TUPLE_ENUM tuple]
#define CONSTRUCT_PROCS(unused, idx, seq) /* тут конкатинируем 'CONSTRUCT_CONCRETE_' и 'proc' или 'enum', и экспандим его */ \
BOOST_PP_EXPAND(BOOST_PP_CAT(CONSTRUCT_CONCRETE_, BOOST_PP_SEQ_ELEM(idx, seq)))
#define CONSTRUCT(name, seq) \
struct name { \
BOOST_PP_REPEAT( \
BOOST_PP_SEQ_SIZE(seq) \
,CONSTRUCT_PROCS \
,seq \
) \
}; /* struct name */
/***************************************************************************/
CONSTRUCT(
type1
,
(proc(m0, (float)))
(proc(m1, (int, long)))
(enum(mye1, (e0, e1, e2)))
)
/***************************************************************************/
суть кода — получить возможность обрабатывать последовательности типов разными способами.
сейчас, при препроцессировании, получаю такой код:
struct type1 {
myproc[m0: BOOST_PP_CAT(BOOST_PP_TUPLE_REM_CTOR_O_, 1)(float)]
myproc[m1: BOOST_PP_CAT(BOOST_PP_TUPLE_REM_CTOR_O_, 2)(int, long)]
myenum[mye1: BOOST_PP_CAT(BOOST_PP_TUPLE_REM_CTOR_O_, 3)(e0, e1, e2)]
};
этот код полностью валиден, за исключением того, что эти строки начинающиеся с 'BOOST_PP_CAT' — должны обрабатываться препроцессором, чего не происходит.
не понимаю, от чего так?
спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)