#ifndef CACHE_H #define CACHE_H #include #include template class Cache { public: using Ptr = std::shared_ptr; virtual ~Cache() = default; [[nodiscard]] Ptr get(const std::string & key) { if (auto e = cached.find(key); e != cached.end()) { return e->second; } return cached.emplace(key, construct(key)).first->second; } [[nodiscard]] virtual Ptr construct(const std::string & key) const { return std::make_shared(key); } private: std::map cached; }; #endif