SWITCH на препроцессоре (boost::preprocessor)
От: nen777w  
Дата: 15.06.11 11:11
Оценка:
Понадобилась вот такая конструкция как 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'


Можно пойти на сделку с совестью и придушить этот варнинг. Но это как то не кузяво.
Может есть ещё вариант который Я не вижу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.