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, то количество повторений на единицу меньше чем нужно. Эти требования можно одновременно удовлетворить?
Re: Boost.Preprocessor, Indexes Shifting
От: jazzer Россия Skype: enerjazzer
Дата: 12.10.09 01:31
Оценка: 36 (2)
Здравствуйте, skeptik_, Вы писали:

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


Можно, используй BOOST_PP_INC/BOOST_PP_DEC
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Boost.Preprocessor, Indexes Shifting
От: Vain Россия google.ru
Дата: 12.10.09 09:44
Оценка:
Здравствуйте, jazzer, Вы писали:

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

J>Можно, используй BOOST_PP_INC/BOOST_PP_DEC
Я думаю, что если топикастер захотел удалить свой пост, то ответ он уже нашёл.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: Boost.Preprocessor, Indexes Shifting
От: jazzer Россия Skype: enerjazzer
Дата: 12.10.09 13:08
Оценка:
Здравствуйте, Vain, Вы писали:

V>Я думаю, что если топикастер захотел удалить свой пост, то ответ он уже нашёл.


Даже если и так, он не единственный, кто читает этот форум, другие тоже вполне могут столкнуться с подобной проблемой.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Boost.Preprocessor, Indexes Shifting
От: Vain Россия google.ru
Дата: 12.10.09 13:14
Оценка: -2
Здравствуйте, jazzer, Вы писали:

V>>Я думаю, что если топикастер захотел удалить свой пост, то ответ он уже нашёл.

J>Даже если и так, он не единственный, кто читает этот форум, другие тоже вполне могут столкнуться с подобной проблемой.
Вот таким образом форум и зас.рается.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: Boost.Preprocessor, Indexes Shifting
От: skeptik_  
Дата: 13.10.09 08:45
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, jazzer, Вы писали:


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

J>>Можно, используй BOOST_PP_INC/BOOST_PP_DEC
V>Я думаю, что если топикастер захотел удалить свой пост, то ответ он уже нашёл.

Ага, что-то тормознул я... Я правда BOOST_PP_ADD и BOOST_PP_SUB заюзал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.