std::any
- это тип словарь .Когда вам нужно сохранить что-то, что угодно, в качестве значения вы можете использовать его.
Существует несколько вариантов использования «первого уровня»:
При взаимодействии с языками сценариев, которые сами имеют такие типы, это естественное соответствие.
Когда у вас есть дерево свойств с очень полиморфным содержимым, и структура дерева отделенаот производителя и потребителя дерева.
При замене эквивалента куска void*
данных, передаваемых через промежуточный уровень, которому действительно все равно, что он несет.
В других случаях его также можно использовать как строительный блок.Например, std::function
может сохранить свое значение в std::any
:
template<class R, class...Args>
struct func<R(Args...)> {
mutable std::any state;
R(*f)(std::any& state, Args&&...) = nullptr;
template<class T>
void bind(T&& t) {
state = std::forward<T>(t);
f = [](std::any& state, Args&&...args)->R {
return std::any_cast<T&>(state)(std::forward<Args>(args)...);
};
}
R operator()(Args...args)const {
return f(state, std::forward<Args>(args)...);
}
};
, который является довольно маленькой реализацией (большей части) std::function
.В основном я использовал any
, чтобы напечатать erase copy / move / destroy.
Вы можете использовать это в другом месте для подобных проблем (когда вы стираете какую-то операцию, а также хотите набрать erase copy / move /уничтожить) или обобщить .