std::mutable_wrapper
demagleb opened this issue · 0 comments
demagleb commented
Обертка для типа, аннулирующая действие const.
Бывают случаи, когда хочется иметь константный контейнер с мутабельными элементами. Например, в многопоточном коде можно зафиксировать множество элементов с помощью добавления const к контейнеру, что предотвращает несинхронизированное изменение контейнера, при этом сохраняется мутабельность уже добавленных элементов.
const std::map<int, std::mutable_wrapper<std::atomic<int>>> counters = [] {
std::map<int, std::mutable_wrapper<std::atomic<int>>> counters;
counters.emplace(1, 1);
return counters;
}();
counters.at(1).fetch_add(1);
На текущий момент, получить подобное поведение можно с помощью указателей или std::reference_wrapper, что ведет к лишним аллокациям либо лишним структурам для хранения элементов.
Реализация с похожим на std::reference_wrapper интерфейсом:
template <typename T>
class mutable_wrapper {
public:
template <typename... Args>
mutable_wrapper(Args&& ...args) : value_(std::forward<Args>(args)...) {}
operator T& () const noexcept { return value_; }
T& get() const noexcept { return value_; }
private:
mutable T value_;
};