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

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

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

0

Решение

Ты не можешь получить размер объекта, удерживаемого std::any (кроме упомянутого вами обходного пути). std::any это минимальный реализация типа стирания.

Если вы хотите что-то более мощное, напишите это самостоятельно (это не сложно, просто смоделируйте std::any или же boost::any и добавить size() функциональность).
Есть много других вещей, которые вы можете добавить к anyнапример, ввод-вывод, хранение нескольких данных (или содержимого любого контейнера) в виде массивов и т. д.

За счет дополнительного элемента данных (для хранения размера) вы также можете продлить std::any написав обертку, как предложено в Витторио ответ.

3

Другие решения

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>)} { }

// ...
};
3

По вопросам рекламы [email protected]