1 // { dg-do compile { target c++11 } } 2 template<typename T> 3 struct uncvref 4 { 5 typedef T type; 6 }; 7 8 template<typename... Args> 9 struct args 10 { 11 static const int size = sizeof...(Args); 12 }; 13 14 template<typename G, typename E, typename S, typename V, long GN = G::size, long EN = E::size> 15 struct apply_args; 16 17 template<typename... G, typename... E, typename S, typename V, long N> 18 struct apply_args<args<G...>, args<E...>, S, V, N, N> 19 { 20 typedef args< 21 typename G::template apply<typename uncvref<E>::type, S, V>::type... 22 > type; 23 }; 24 25 struct or_ 26 { 27 template<typename E, typename S, typename V> 28 struct apply { 29 typedef typename E::type type; 30 }; 31 }; 32 33 template<typename T> 34 struct identity 35 { 36 typedef T type; 37 }; 38 39 apply_args<args<or_>, args<identity<int>>, float, double> a1; 40