Есть ли способ получить размер (в байтах) данных, хранящихся std::any
? Единственный обходной путь, который я нашел, — это запрос типа его значения std::any::type
и сравнивая результат со списком известных типов, таких как my_any.type() == typeid(T)
тогда размер sizeof(T)
, К сожалению, это решение работает только тогда, когда типы известны заранее.
Вы знаете какое-нибудь решение?
Ты не можешь получить размер объекта, удерживаемого std::any
(кроме упомянутого вами обходного пути). std::any
это минимальный реализация типа стирания.
Если вы хотите что-то более мощное, напишите это самостоятельно (это не сложно, просто смоделируйте std::any
или же boost::any
и добавить size()
функциональность).
Есть много других вещей, которые вы можете добавить к any
например, ввод-вывод, хранение нескольких данных (или содержимого любого контейнера) в виде массивов и т. д.
За счет дополнительного элемента данных (для хранения размера) вы также можете продлить std::any
написав обертку, как предложено в Витторио ответ.
std::any
не предоставляет никакого способа выполнить действие с базовым хранимым типом T
, Тем не менее, информация, как sizeof(T)
может быть доступно при инициализации / назначении std::any
,
Одним из возможных решений является создание собственной обертки вокруг std::any
это отслеживает размер. Например.
class my_any : std::any
{
std::size_t _stored_size = 0;
public:
template <typename T>
my_any(T&&) : _stored_size{sizeof(std::decay_t<T>)} { }
// ...
};