Сначала мы определяем класс приоритета.
template<unsigned P> struct priority : priority<P-1> {};
template<> struct priority<0> {};
Он может быть использован для получения общего порядка на функции следующим образом:
template<class Int> auto call_best(Int i, priority<2>) -> decltype(f(i)) { return f(i); }
template<class Int> auto call_best(Int i, priority<1>) -> decltype(g(i)) { return g(i); }
template<class Int> auto call_best(Int i, priority<0>) -> decltype(h(i)) { return h(i); }
void call_best(int i) { call_best(i, priority<2>{}); }
Int
параметр шаблона и decltype()
убедитесь, что только определенные функции конкурируют за то, что называется (ключевое слово SFINAE). Класс тегов priority
позволяет нам выбрать лучший из них.
Обратите внимание, что часть SFINAE работает только в том случае, если у вас есть как минимум один параметр, на котором вы можете создать шаблон. Если у кого-то есть идея о том, как этого избежать, скажите, пожалуйста.
Просто любопытно, что случай использования этого? –
Все эти функции определены. –
@NicolasHolthaus: Я думаю, что OP хочет сделать что-то вроде [call-a-free-function-вместо-of-method-if-it-doesnt-exist] (http://stackoverflow.com/questions/21441803/ call-a-free-function-in-a-method-if-it-doesnt-exist) – Jarod42