KISS template pattern matching
От: remark Россия http://www.1024cores.net/
Дата: 02.03.10 11:00
Оценка: 336 (27)
Мой вариант template pattern matching
Автор: jazzer
Дата: 02.03.10


Всё, что нам понадобится, это... нет, я не буду приводить это в конце, т.к. это всего 3 строчки
template<int idx> struct prio;
template<int idx> struct prio : prio<idx - 1> {};
template<> struct prio<0> {};


И дальше мы можем просто явно задать приоритет функций для разрешения неоднозначностей. Т.е. если у нас есть специализация для is_arithmetic с приоритетом 1, и специализация для is_integral с приоритетом 2, то будет выбрана последняя. Фактически это идентично паттерн-матчингу Haskell и изначальному примеру jazzer'а с if-elseif-else, где последующий вариант рассматривается только если не подошёл предыдущий.

template<typename T>
string
foo(T, prio<0>)
{
    return "general";
}

template<typename T>
typename enable_if<is_arithmetic< T >, string >::type
foo(T, prio<1>)
{
    return "arithmetic";
}

template<typename T>
typename enable_if<is_integral< T >, string >::type
foo(T, prio<2>)
{
    return "integral";
}

template<typename T>
string foo(T t)
{
    return foo(t, prio<100>());
}


Варианты можно записывать от общего к частному или от частного к общему — это уж как хотите.

Проверяем:
int main()
{
    cout << "int: " << foo(1) << endl;
    cout << "string: " << foo(string()) << endl;
    cout << "float: " << foo(1.f) << endl;
}


int: integral
string: general
float: arithmetic



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.