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