cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
90 stars 0 forks source link

std::unique_any - не требующий копируемости вариант std::any #441

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Изначально, std::any позиционировался как безопасная замена void*, но что-то пошло не по плану. В С++20 нет возможности поместить в std::any некопируемые типы, например типы содержащие std::unqiue_ptr или std::mutex.

Решение - std::unique_any

Отдельный класс std::unique_any полностью повторяющий интерфейс std::any но без конcтруторов копирования и операторов присвоения от unique_any http://eel.is/c++draft/any.class.general

Пример использования:

std::unique_any var;
var = 42;
var.emplace(std::in_place<std::mutex>);

var.reset();

std::lock_guard lock{std::any_cast<std::mutex>(var)};
auto shared_var = std::make_shared<std::unique_any>(42); // 2 allocations

Плюсы:

Минусы:

apolukhin commented 3 years ago

Альтернативный подход - std::any_storage (но он очень неудобный)

Базовый класс хранилища, делающий type erasure.

Пример использования:

std::unique_ptr<std::any_storage> var;
// var = 42; // ill formed
// var.emplace(std::in_place<std::mutex>); // no emplace
var = std::make_any_storage(42);

var.reset();

std::lock_guard lock{std::any_cast<std::mutex>(var)};
auto my_var = boost::shared_ptr<std::any_storage>(std::make_any_storage(42)); // 2 allocations

Плюсы:

Минусы:

apolukhin commented 3 years ago

Микро обсуждение на std-proposals https://lists.isocpp.org/std-proposals/2020/05/1428.php

apolukhin commented 8 months ago

Добавили функционал в Boost https://www.boost.org/doc/libs/1_83_0/doc/html/boost/anys/unique_any.html