Моя локальная версия заголовков Boost (1.56.0) имеет следующие функции, определенные в boost/any.hpp
Копия дословно:
// Note: The "unsafe" versions of any_cast are not part of the
// public interface and may be removed at any time. They are
// required where we know what type is stored in the any and can't
// use typeid() comparison, e.g., when our types may travel across
// different shared libraries.
template<typename ValueType>
inline ValueType * unsafe_any_cast(any * operand) BOOST_NOEXCEPT
{
return &static_cast<any::holder<ValueType> *>(operand->content)->held;
}
template<typename ValueType>
inline const ValueType * unsafe_any_cast(const any * operand) BOOST_NOEXCEPT
{
return unsafe_any_cast<ValueType>(const_cast<any *>(operand));
}
Хотя онлайн-документация даже не подтверждает их существование: http://www.boost.org/doc/libs/1_59_0/doc/html/any/reference.html
Я заметил, что std::any
также, кажется, не имеет поддержки небезопасного броска.
Почему стандарт C ++ 17 не вводит std::unsafe_any_cast
?
Если точная причина не может быть найдена (или если она просто никогда не была предложена), какие будут наиболее убедительные аргументы, чтобы не обеспечить небезопасный доступ к значению, хранящемуся в std::any
объект?
std::any
это типобезопасный Контейнер для отдельных значений любого типа.
Обратите внимание на комментарий в фрагменте, который вы разместили, что Boost’s unsafe_any_cast
является не часть публичного интерфейса. Это деталь реализации, и она не предназначена для использования конечным пользователем. Вот почему это не упоминается в документации.
Продвижение его в общедоступный интерфейс нарушило бы цель, прежде всего, создать контейнер с безопасным типом.
Других решений пока нет …