Получить размер std::any

Есть ли способ получить размер (в байтах) данных, хранящихся std::any? Единственный обходной путь, который я нашел, - это запрос типа его значения std::any::type и сравнивая результат со списком известных типов, таких как my_any.type() == typeid(T)тогда размер sizeof(T), К сожалению, это решение работает только тогда, когда типы известны заранее.

Вы знаете какое-нибудь решение?

2 ответа

Решение

Вы не можете получить размер объекта, удерживаемого 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>)} { }

    // ...
};
Другие вопросы по тегам