#include <iostream>
template <typename T>
class global_ptr
{
public:
T* get()
{
return &get_instance();
}
T* operator->()
{
return get();
}
T& operator*()
{
return *get();
}
// could add const overloads, so clients can
// differentiate between read-only and read/write
// access, for smarter mutex locking (shared)
private:
static T& get_instance()
{
static T result;
return result;
}
};
typedef global_ptr<int> global_int;
void foo()
{
// all instances of this actually refer to the same global object
global_int gi;
*gi = 5;
std::cout << *gi << std::endl;
}
void bar()
{
global_int gi;
*gi = 7;
std::cout << *gi << std::endl;
}
int main()
{
// not created until first use
foo();
bar();
global_int gi;
*gi = 11;
std::cout << *gi << std::endl;
}
// could be extended, now, to support destruction policies, etc.
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIGdsb2JhbF9wdHIKewpwdWJsaWM6CiAgICBUKiBnZXQoKQogICAgewogICAgICAgIHJldHVybiAmZ2V0X2luc3RhbmNlKCk7CiAgICB9CgogICAgVCogb3BlcmF0b3ItPigpCiAgICB7CiAgICAgICAgcmV0dXJuIGdldCgpOwogICAgfQoKICAgIFQmIG9wZXJhdG9yKigpCiAgICB7CiAgICAgICAgcmV0dXJuICpnZXQoKTsKICAgIH0KICAgIAogICAgLy8gY291bGQgYWRkIGNvbnN0IG92ZXJsb2Fkcywgc28gY2xpZW50cyBjYW4gCiAgICAvLyBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcmVhZC1vbmx5IGFuZCByZWFkL3dyaXRlIAogICAgLy8gYWNjZXNzLCBmb3Igc21hcnRlciBtdXRleCBsb2NraW5nIChzaGFyZWQpCiAgICAKcHJpdmF0ZToKICAgIHN0YXRpYyBUJiBnZXRfaW5zdGFuY2UoKQogICAgewogICAgICAgIHN0YXRpYyBUIHJlc3VsdDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQp9OwoKdHlwZWRlZiBnbG9iYWxfcHRyPGludD4gZ2xvYmFsX2ludDsKCnZvaWQgZm9vKCkKewogICAgLy8gYWxsIGluc3RhbmNlcyBvZiB0aGlzIGFjdHVhbGx5IHJlZmVyIHRvIHRoZSBzYW1lIGdsb2JhbCBvYmplY3QKICAgIGdsb2JhbF9pbnQgZ2k7CiAgICAqZ2kgPSA1OwogICAgCiAgICBzdGQ6OmNvdXQgPDwgKmdpIDw8IHN0ZDo6ZW5kbDsKfQoKdm9pZCBiYXIoKQp7CiAgICBnbG9iYWxfaW50IGdpOwogICAgKmdpID0gNzsKICAgIAogICAgc3RkOjpjb3V0IDw8ICpnaSA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKCkKewogICAgLy8gbm90IGNyZWF0ZWQgdW50aWwgZmlyc3QgdXNlCiAgICBmb28oKTsKICAgIGJhcigpOwogICAgCiAgICBnbG9iYWxfaW50IGdpOwogICAgKmdpID0gMTE7CiAgICAKICAgIHN0ZDo6Y291dCA8PCAqZ2kgPDwgc3RkOjplbmRsOwp9CgovLyBjb3VsZCBiZSBleHRlbmRlZCwgbm93LCB0byBzdXBwb3J0IGRlc3RydWN0aW9uIHBvbGljaWVzLCBldGMu