1 template <typename T>
no_arg()2 T no_arg() {
3     return T();
4 }
5 
6 template <typename T>
one_param(T value)7 T one_param(T value) {
8     return value;
9 }
10 
11 template <typename T, typename U>
two_params(T a,U b)12 std::pair<T, U> two_params(T a, U b) {
13     return std::pair<T, U>(a, b);
14 }
15 
16 template <typename T>
17 class A {
18     public:
19         template <typename U>
method(T a,U b)20         std::pair<T, U> method(T a, U b) {
21             return std::pair<T, U>(a, b);
22         }
23         template <typename U>
part_method(std::pair<T,U> p)24         U part_method(std::pair<T, U> p) {
25             return p.second;
26         }
27         template <typename U>
part_method_ref(const std::pair<T,U> & p)28         U part_method_ref(const std::pair<T, U>& p) {
29             return p.second;
30         }
31 
overloaded(double d)32         int overloaded(double d) {
33             return (int) d;
34         }
overloaded(std::pair<T,T> p)35         T overloaded(std::pair<T, T> p) {
36             return p.first;
37         }
38         template <typename U>
overloaded(std::vector<U> v)39         U overloaded(std::vector<U> v) {
40             return v[0];
41         }
42         template <typename U>
overloaded(char * c,std::vector<U> v)43         U overloaded(char* c, std::vector<U> v) {
44             return v[0];
45         }
46 };
47 
48 template <typename T>
nested_deduction(const T * a)49 T nested_deduction(const T *a) {
50     return *a;
51 }
52 
53 template <typename T, typename U>
pair_arg(std::pair<T,U> a)54 std::pair<T, U> pair_arg(std::pair<T, U> a) {
55     return a;
56 }
57 
58 template <typename T>
pointer_param(T * param)59 T* pointer_param(T* param) {
60     return param;
61 }
62 
63 class double_pair : public std::pair<double, double> {
64   public:
double_pair(double x,double y)65     double_pair(double x, double y) : std::pair<double, double>(x, y) { };
66 };
67