Понадобилась вот такая конструкция как SWITCH.
| Скрытый текст |
| [ccode = "Мой вариант имплементации:"]
//switch
#define DECLARE_CASE_TUPLE( key, seq ) ((key, seq))
#define __SWITCH_PRED(s, data, elem) BOOST_PP_EQUAL( BOOST_PP_TUPLE_ELEM(2,0,elem), data )
#define SWITCH( idx, switch_seq_result_idx, switch_seq ) \
BOOST_PP_SEQ_ELEM(switch_seq_result_idx,BOOST_PP_TUPLE_ELEM(2,1, BOOST_PP_SEQ_ELEM(0,BOOST_PP_SEQ_FILTER(__SWITCH_PRED, idx, switch_seq))))
[/ccode] |
| |
| "Использование:" |
| #define MY_SWITCH() \
DECLARE_CASE_TUPLE( 0, (a)(b)(c) ) \
DECLARE_CASE_TUPLE( 1, (d)(e)(f) ) \
DECLARE_CASE_TUPLE( 2, (g)(h)(j) )
SWITCH( 1, 2, MY_SWITCH()) //f
SWITCH( 2, 0, MY_SWITCH()) //g
|
| |
Что не нравится. Нету DEFAULT обработки.
Т.е. вот так:
#define DECLARE_DEFAULT_TUPLE( seq ) ((seq))
её можно сделать легко ограничив сиквенс в BOOST_PP_SEQ_FILTER на -1 и обязав пользователя писать его (DEFAULT)
всегда и только в конце всех кейсов.
Но вот проблема:
#define SEQ()
BOOST_PP_SEQ_SIZE( SEQ() )
хоть и работает правильно т.е. результатом этого будет 0. Но компилятору это не нравится и он говорит:
warning C4003: not enough actual parameters for macro 'BOOST_PP_SEQ_SIZE_I'
Можно пойти на сделку с совестью
и придушить этот варнинг. Но это как то не кузяво.
Может есть ещё вариант который Я не вижу.