Re: template pattern matching
От: zaufi Земля  
Дата: 02.03.10 07:55
Оценка: 62 (1)
чтобы уменьшить синтаксический оверхед я бы еще замутил пару фичек:

1) дабы не писать в обязательом порядке последним элементом сиквенса условий boost::mpl::identity, может луче его push_back'ать в chain_cond_match перед тем как начать основные действия... все равно он па любому должен быть последним... и более того буит оч неприятно разбирать километры спама от компилятора если его случайно забыть

template< class CondSeq, class Index >
struct chain_cond_match
{
  typedef typename boost::mpl::push_back<CondSeq, boost::mpl::identity< boost::mpl::true_> >::type seq_with_default;
  typedef typename take< seq_with_default, Index >::type prev;
  typedef typename
    boost::mpl::and_< typename boost::mpl::at< seq_with_default, Index >::type
                    , boost::is_same< typename boost::mpl::find_if< prev, boost::mpl::_ >::type
                                    , typename boost::mpl::end< prev >::type
                    > >::type type;
};


2) не оч сложно избавиться от необходимости создавать свой класс каждый раз когда хочется завести новую пачку условий... lambda нам поможет!
typedef boost::mpl::vector<
    boost::is_same<boost::mpl::_, char>
  , boost::is_integral<boost::mpl::_>
  , boost::is_arithmetic<boost::mpl::_>
  > conditions;


imho выглядит несколько покороче чем создание собственного класса... ну да, слегка изменится синтаксис вызова enable_cond'a... както так:

template < class T >
typename enable_cond_c< conditions, T, 0, const char* >::type
f(T x)
{
    return "char";
}

ну и код для проверки условия чуть усложнится на один boost::mpl::apply -- но веть это внутренности реализации )

3) раз уж мы впихиваем identity сами, от чего бы не сделать специализацию enable_cond'a для деволтного значения таким обраазом чтоб не приходилось писать индекс условия!?... ну типа дефольный параметр равный сиквенс сайзу (+1, ибо мы веть теперь сами добавляем дефольный кондишин %)

ну вот както так
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.