boost.preprocessor не разворачивает макровызовы, почему-то
От: niXman Ниоткуда https://github.com/niXman
Дата: 12.01.14 18:52
Оценка:
снова здравствуйте!

есть такой код:

#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 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.