#include <iostream>
using namespace std;
template<class T>
struct RefValue
{
typedef const T& Tp;
};
template<> struct RefValue<int>{typedef int Tp;};
template<class T>
typename RefValue<T>::Tp mymin(typename RefValue<T>::Tp a, typename RefValue<T>::Tp b)
{
return a < b ? a : b;
}
struct Obj{
bool operator < (const Obj& other)const{return true;}
};
int main() {
// your code goes here
Obj o1;
Obj o2;
int i10=10, i12=12;
const int& z = mymin<int>(i10,i12);
std::cout << "i10: " << &i10 <<
" i12: " << &i12 <<
" min: " << &z << "\n";
std::cout << mymin<int>(i10, i12);
const Obj& om = mymin<Obj>(o1, o2);
std::cout << "\nObj1:" << (void*) &o1 << " Obj2:" << (void*) &o2;
std::cout << "\nObj:" << (void*) &om << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBSZWZWYWx1ZQp7Cgl0eXBlZGVmIGNvbnN0IFQmIFRwOwp9OwoKdGVtcGxhdGU8PiBzdHJ1Y3QgUmVmVmFsdWU8aW50Pnt0eXBlZGVmIGludCBUcDt9OwoKdGVtcGxhdGU8Y2xhc3MgVD4KdHlwZW5hbWUgUmVmVmFsdWU8VD46OlRwIG15bWluKHR5cGVuYW1lIFJlZlZhbHVlPFQ+OjpUcCBhLCB0eXBlbmFtZSAgUmVmVmFsdWU8VD46OlRwIGIpCnsKCXJldHVybiBhIDwgYiA/IGEgOiBiOwp9CgpzdHJ1Y3QgT2JqewogICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IE9iaiYgb3RoZXIpY29uc3R7cmV0dXJuIHRydWU7fQp9OwoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglPYmogbzE7IAoJT2JqIG8yOwoJaW50IGkxMD0xMCwgaTEyPTEyOwoJY29uc3QgaW50JiB6ID0gbXltaW48aW50PihpMTAsaTEyKTsKCXN0ZDo6Y291dCA8PCAiaTEwOiAiIDw8ICZpMTAgPDwKCSAgICAgICAgICAgICIgaTEyOiAiIDw8ICZpMTIgPDwgCgkgICAgICAgICAgICAiIG1pbjogIiA8PCAmeiA8PCAiXG4iOwoJCglzdGQ6OmNvdXQgPDwgbXltaW48aW50PihpMTAsIGkxMik7CgkKCWNvbnN0IE9iaiYgb20gPSBteW1pbjxPYmo+KG8xLCBvMik7CglzdGQ6OmNvdXQgPDwgIlxuT2JqMToiIDw8ICh2b2lkKikgJm8xIDw8ICIgT2JqMjoiIDw8ICh2b2lkKikgJm8yOwoJc3RkOjpjb3V0IDw8ICJcbk9iajoiIDw8ICh2b2lkKikgJm9tIDw8ICJcbiI7CgkKCXJldHVybiAwOwp9