Выделяется два или более любых типа, Type1...TypeN, для которых реализуется такая шаблонная функция:
template<class T1, class T2> void f(T1 &t1, T2 &t2)
Если хотябы один её параметр имеет тип не из набора, то механизм SFINAE может подставить другую перегруженную функцию f, наличие которой не должно вносить неразбериху. Короче, должна работать перегрузка:
template<class T1, class T2> void f(T1 &t1, T2 &t2)//T1, T2 из набора Type1...TypeN
void f(OutListType1 &t1, OutListType2 &t2)
void f(OutListType3 &t1, OutListType4 &t2)
Задача такая: написать универсальную функцию
template<class T1, class T2> void f(T1 &t1, T2 &t2)
так, чтобы полноценно работал механизм выбора перегруженных функций через SFINAE, как реализовать набор типов?