template<int I, class T>
struct match_base{
static int_<I> test(T);
};
template<int Cur, class T, class... Us>
struct match_bases
: match_base<Cur, T>
, match_bases<Cur+1, Us...>
{
using match_base<Cur, T>::test;
using match_bases<Cur+1, Us...>::test;
};
template<int I, class T>
struct match_bases<I, T>
: match_base<I, T>
{
using match_base<I, T>::test;
};
template<class... Us>
struct best_match_
: match_bases<0, Us...>
{
using match_bases<0, Us...>::test;
template<class V>
static auto test2(int) -> decltype(test(std::declval<V>()));
template<class>
static auto test2(...) -> int_<-1>;
};
template<class T, class... Us>
using best_match = decltype(best_match_<Us...>::template test2<T>(0));
dGVtcGxhdGU8aW50IEksIGNsYXNzIFQ+CnN0cnVjdCBtYXRjaF9iYXNlewogIHN0YXRpYyBpbnRfPEk+IHRlc3QoVCk7Cn07Cgp0ZW1wbGF0ZTxpbnQgQ3VyLCBjbGFzcyBULCBjbGFzcy4uLiBVcz4Kc3RydWN0IG1hdGNoX2Jhc2VzCiAgOiBtYXRjaF9iYXNlPEN1ciwgVD4KICAsIG1hdGNoX2Jhc2VzPEN1cisxLCBVcy4uLj4KewogIHVzaW5nIG1hdGNoX2Jhc2U8Q3VyLCBUPjo6dGVzdDsKICB1c2luZyBtYXRjaF9iYXNlczxDdXIrMSwgVXMuLi4+Ojp0ZXN0Owp9OwoKdGVtcGxhdGU8aW50IEksIGNsYXNzIFQ+CnN0cnVjdCBtYXRjaF9iYXNlczxJLCBUPgogIDogbWF0Y2hfYmFzZTxJLCBUPgp7CiAgdXNpbmcgbWF0Y2hfYmFzZTxJLCBUPjo6dGVzdDsKfTsKCnRlbXBsYXRlPGNsYXNzLi4uIFVzPgpzdHJ1Y3QgYmVzdF9tYXRjaF8KICAgIDogbWF0Y2hfYmFzZXM8MCwgVXMuLi4+CnsKICB1c2luZyBtYXRjaF9iYXNlczwwLCBVcy4uLj46OnRlc3Q7CgogIHRlbXBsYXRlPGNsYXNzIFY+CiAgc3RhdGljIGF1dG8gdGVzdDIoaW50KSAtPiBkZWNsdHlwZSh0ZXN0KHN0ZDo6ZGVjbHZhbDxWPigpKSk7CiAgdGVtcGxhdGU8Y2xhc3M+CiAgc3RhdGljIGF1dG8gdGVzdDIoLi4uKSAtPiBpbnRfPC0xPjsKfTsKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzLi4uIFVzPgp1c2luZyBiZXN0X21hdGNoID0gZGVjbHR5cGUoYmVzdF9tYXRjaF88VXMuLi4+Ojp0ZW1wbGF0ZSB0ZXN0MjxUPigwKSk7