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