чтобы уменьшить синтаксический оверхед я бы еще замутил пару фичек:
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, ибо мы веть теперь сами добавляем дефольный кондишин %)
ну вот както так