#include <iostream>
#include <memory>


template<typename T>
class CountedInstance
{
public:
    CountedInstance() { sCount++; }

    ~CountedInstance() { --sCount; }

    unsigned count() const { return sCount; }

private:
    static unsigned sCount;
};

template<typename T>
unsigned CountedInstance<T>::sCount = 0;


template<class T>
class SharedResource : public CountedInstance<T>
{
public:
    typedef std::shared_ptr<T> Ptr;

    SharedResource() : mPtr((this->count() == 1) ? Ptr(new T) : Ptr()) {}

private:
    Ptr mPtr;
};


struct Timer {
    Timer() { std::cout << "Create Timer" << std::endl; }
    ~Timer() { std::cout << "Destroy Timer" << std::endl; }
};

struct Widget : public SharedResource<Timer>
{
    Widget() { std::cout << "  Create Widget " << this->count() << std::endl; }
    ~Widget() { std::cout << "  Destroy Widget " << this->count() << std::endl; }
};

int main()
{
    { Widget w1, w2, w3; }
    { Widget w1, w2, w3; }
    { Widget w1, w2, w3; }
}