// one more overload before ... template< typename Selector, typename Head, typename Tail, typename Default, typename ToSelect, typename Selected > auto runIfValid( Selector &sel, Head, Tail, Default, ToSelect, Selected, Preferred, NotPreferred ) -> typename std::enable_if< ! std::is_base_of< InstantiationError, Head >::value && EvalBoolExpr< ContainsP< Selected >::template Elem, typename Head::SupportedBy >::value, typename Selector::ReturnType >::type { return sel.ifSelect( Head(), [ &sel ]() { return runSelector( sel, ToSelect(), typename Append< Head, Selected >::T() ); }, [ &sel ]() { return runOne( sel, Tail(), Default(), ToSelect(), Selected() ); } ); } // and one after ...