#pragma once class singleton; class singleton_initliazer { public: bool has_init(singleton* s); void init_singleton(singleton* s); template T* require() { auto instance = T::get(); if (has_init(instance)) { return instance; } singletons_.push_back(instance); instance->init(*this); return instance; } std::vector singletons_{}; }; class CORE_API singleton_manager { public: static singleton_manager* get() { static singleton_manager instance; return &instance; } void add(singleton* s); void init(); void release() const; private: std::vector singletons_; };