#pragma once #include namespace Utils::Concurrency { template class Container { public: template R access(F&& accessor) const { std::lock_guard _{mutex_}; return accessor(object_); } template R access(F&& accessor) { std::lock_guard _{mutex_}; return accessor(object_); } template R accessWithLock(F&& accessor) const { std::unique_lock lock{mutex_}; return accessor(object_, lock); } template R accessWithLock(F&& accessor) { std::unique_lock lock{mutex_}; return accessor(object_, lock); } T& getRaw() {return object_;} const T& getRaw() const {return object_;} private: mutable MutexType mutex_{}; T object_{}; }; }