1 // { dg-do compile { target c++11 } }
2 
3 template<typename...> struct tuple { };
4 
5 template<template<typename T> class Meta, typename... Values>
6 struct apply_all
7 {
8   typedef tuple<typename Meta<Values>::type...> type;
9 };
10 
11 template<typename T, typename U>
12 struct is_same {
13   static const bool value = false;
14 };
15 
16 template<typename T>
17 struct is_same<T, T> {
18   static const bool value = true;
19 };
20 
21 template<typename T>
22 struct add_reference {
23   typedef T& type;
24 };
25 
26 template<typename T>
27 struct add_reference<T&> {
28   typedef T& type;
29 };
30 
31 static_assert(is_same<apply_all<add_reference, int, int&, float>::type,
32  	                        tuple<int&, int&, float&> >::value,
33 	      "check apply");
34