#include <iostream>
void* my_crazy_function(int id) {
static int a = 5;
static double b = 7;
if(id == 1) return &a;
if(id == 2) return &b;
return 0;
}
template<typename T, int def>
T vp_to_val(void *p) {
return p ? *static_cast<T*>(p) : static_cast<T>(def);
}
int main()
{
std::cout << vp_to_val<int, 0>(my_crazy_function(1)) << std::endl;
std::cout << vp_to_val<int, 0>(my_crazy_function(4)) << std::endl;
std::cout << vp_to_val<double, 1>(my_crazy_function(2)) << std::endl;
std::cout << vp_to_val<double, 1>(my_crazy_function(4)) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdm9pZCogbXlfY3JhenlfZnVuY3Rpb24oaW50IGlkKSB7CiAgICBzdGF0aWMgaW50IGEgPSA1OwogICAgc3RhdGljIGRvdWJsZSBiID0gNzsKICAgIGlmKGlkID09IDEpIHJldHVybiAmYTsKICAgIGlmKGlkID09IDIpIHJldHVybiAmYjsKICAgIHJldHVybiAwOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgZGVmPgpUIHZwX3RvX3ZhbCh2b2lkICpwKSB7CiAgICByZXR1cm4gcCA/ICpzdGF0aWNfY2FzdDxUKj4ocCkgOiBzdGF0aWNfY2FzdDxUPihkZWYpOyAgICAKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OmNvdXQgPDwgdnBfdG9fdmFsPGludCwgMD4obXlfY3JhenlfZnVuY3Rpb24oMSkpIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCB2cF90b192YWw8aW50LCAwPihteV9jcmF6eV9mdW5jdGlvbig0KSkgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IHZwX3RvX3ZhbDxkb3VibGUsIDE+KG15X2NyYXp5X2Z1bmN0aW9uKDIpKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgdnBfdG9fdmFsPGRvdWJsZSwgMT4obXlfY3JhenlfZnVuY3Rpb24oNCkpIDw8IHN0ZDo6ZW5kbDsKfQ==