Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

std::mutable_wrapper #601

Open
demagleb opened this issue Oct 6, 2024 · 0 comments
Open

std::mutable_wrapper #601

demagleb opened this issue Oct 6, 2024 · 0 comments

Comments

@demagleb
Copy link

demagleb commented Oct 6, 2024

Обертка для типа, аннулирующая действие 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_;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant