#include <mutex>
#include <map>
template <class T>
struct Proxy{
Proxy(T &t, std::mutex &m) : value{t}, l{m}{}
T &value;
private:
std::unique_lock<std::mutex> l;
};
template <class T>
struct Protected{
Proxy<T> get(){
return {t, m};
}
private:
T t;
std::mutex m;
};
int main() {
Protected<std::map<int, int>> pm;
pm.get().value[42] = 5;
}
I2luY2x1ZGUgPG11dGV4PgojaW5jbHVkZSA8bWFwPgoKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0cnVjdCBQcm94eXsKCVByb3h5KFQgJnQsIHN0ZDo6bXV0ZXggJm0pIDogdmFsdWV7dH0sIGx7bX17fQoJVCAmdmFsdWU7Cglwcml2YXRlOgoJc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsOwp9OwoKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0cnVjdCBQcm90ZWN0ZWR7CglQcm94eTxUPiBnZXQoKXsKCQlyZXR1cm4ge3QsIG19OwoJfQoJcHJpdmF0ZToKCVQgdDsKCXN0ZDo6bXV0ZXggbTsKfTsKCmludCBtYWluKCkgewoJUHJvdGVjdGVkPHN0ZDo6bWFwPGludCwgaW50Pj4gcG07CglwbS5nZXQoKS52YWx1ZVs0Ml0gPSA1Owp9