cpp-ru/ideas

std::mutable_wrapper

demagleb opened this issue · 0 comments

Обертка для типа, аннулирующая действие 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_;
};