#include <iostream>
using namespace std;
template <class T>
const T& max(const T& a1, const T& a2)
{
cout << "genereal template " << a1 << " " << a2 << endl;
return (a1 < a2) ? a2 : a1;
}
template <class T>
const T* max(const T* a1, const T* a2)
{
cout << "template for pointers" << endl;
return (a1 < a2) ? a2 : a1;
}
template <class T>
const T& max(const T& a1, const T& a2, const T& a3)
{
cout << "general template with three parameters" << endl;
return ::max(::max(a1, a2), ::max(a1, a3));
}
int main()
{
int* a = new int(5);
int* b = new int(56);
int* c = new int(2);
int* g = ::max(a, b, c);
cout << *g << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNvbnN0IFQmIG1heChjb25zdCBUJiBhMSwgY29uc3QgVCYgYTIpCnsKICAgIGNvdXQgPDwgImdlbmVyZWFsIHRlbXBsYXRlICIgPDwgYTEgPDwgIiAgIiA8PCBhMiA8PCBlbmRsOwogICAgcmV0dXJuIChhMSA8IGEyKSA/IGEyIDogYTE7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgpjb25zdCBUKiBtYXgoY29uc3QgVCogYTEsIGNvbnN0IFQqIGEyKQp7CiAgICBjb3V0IDw8ICJ0ZW1wbGF0ZSBmb3IgcG9pbnRlcnMiIDw8IGVuZGw7CiAgICByZXR1cm4gKGExIDwgYTIpID8gYTIgOiBhMTsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNvbnN0IFQmIG1heChjb25zdCBUJiBhMSwgY29uc3QgVCYgYTIsIGNvbnN0IFQmIGEzKQp7CiAgICBjb3V0IDw8ICJnZW5lcmFsIHRlbXBsYXRlIHdpdGggdGhyZWUgcGFyYW1ldGVycyIgPDwgZW5kbDsKICAgIHJldHVybiA6Om1heCg6Om1heChhMSwgYTIpLCA6Om1heChhMSwgYTMpKTsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQqIGEgPSBuZXcgaW50KDUpOwogICAgaW50KiBiID0gbmV3IGludCg1Nik7CiAgICBpbnQqIGMgPSBuZXcgaW50KDIpOwogICAgaW50KiBnID0gOjptYXgoYSwgYiwgYyk7CiAgICBjb3V0IDw8ICpnIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=