Boost.Preprocessor, Indexes Shifting
От: skeptik_  
Дата: 11.10.09 09:43
Оценка:
Ознакомившись наконец-то с сабжем, написал следующий код:

#define CAST_ARG(N) *static_cast< ARG_TYPE(N) >( args[N-1].addr )

#define ARGS(z, n, text) text(n)

#define FUNC( z, n, dummy ) \
template< typename OPERATOR > \
typename operator_traits< OPERATOR >::result_type \
call_impl( ArgVector args, UNSIGNED_CONST(n) ) \
{ \
    return OPERATOR()( BOOST_PP_ENUM_SHIFTED(n, ARGS, CAST_ARG) ); \
} \
template< typename OPERATOR > \
int on_open( ArgVector args, Word& storage, UNSIGNED_CONST(n) ) \
{ \
    storage.addr = new OPERATOR( BOOST_PP_ENUM_SHIFTED(n, ARGS, CAST_ARG) ); \
    return 0; \
} \
/**/

BOOST_PP_REPEAT(4, FUNC, nothing)


Проблема в том, что в списке параметров функции (то есть в UNSIGNED_CONST(n)) мне нужны индексы начиная с 0, так же как и в args[n].addr. Но в ARG_TYPE(N) мне нужны индексы от 1. Если заюзать BOOST_PP_ENUM, то в ARG_TYPE неправильные индексы, если юзать BOOST_PP_ENUM_SHIFTED, то количество повторений на единицу меньше чем нужно. Эти требования можно одновременно удовлетворить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.