1 // { dg-do compile { target c++14 } }
2 
3 namespace std {
4 typedef int size_t;
5 template <std::size_t... Indexes>
6 struct index_sequence {};
7 }
8 
9 template <class...> class Tuple {};
10 
11 template <std::size_t I, class TFirst>
get(Tuple<TFirst>)12 auto get(Tuple<TFirst>) {
13   return TFirst();
14 }
15 
16 template <std::size_t I, class Functor, class T1, class T2>
apply_impl(Functor f,T1 t1,T2 t2)17 auto apply_impl(Functor f, T1 t1, T2 t2) {
18   return f(get<I>(t1), get<I>(t2));
19 }
20 
21 template <std::size_t... Indexes, class Functor, class T1, class T2>
map_impl(std::index_sequence<Indexes...>,Functor f,T1 t1,T2 t2)22 auto map_impl(std::index_sequence<Indexes...>, Functor f, T1 t1, T2 t2) {
23   Tuple<decltype(apply_impl<Indexes>(f, t1, t2))...>();
24 }
25 
26 template <class Functor, class T1, class T2>
map_impl(Functor f,T1 t1,T2 t2)27 auto map_impl(Functor f, T1 t1, T2 t2) {
28   map_impl(std::index_sequence<0>(), f, t1, t2);
29 }
30 
31 struct Less {
32   template <class Lhs, class Rhs>
33   auto operator()(Lhs lhs, Rhs rhs) -> decltype(lhs < rhs) {
34     return lhs < rhs;
35   }
36 };
37 
main()38 int main() {
39   auto t1 = Tuple<int>();
40   auto t2 = Tuple<int>();
41   map_impl(Less(), t1, t2);
42 }
43