boost::any
может содержать значения любого типа, но вы должны знать, что он может удержать, чтобы извлекать значение и выделяет память в куче для сохраненного значения.
boost::variant
с другой стороны, может хранить только значение набора определенных типов, и вы можете легко выяснить, что она держится, sizeof
из boost::variant
собирается быть sizeof
наибольшего типа значения содержит + некоторые дополнительными для типа хранимого значения, поскольку он не использует кучную память (если не используется рекурсивный вариант).
С точки зрения использования памяти точка зрения boost::variant
может быть более эффективной, поскольку она не использует кучную память. Кроме того, boost::variant
более безопасен по типу, который boost::any
, компилятор может найти больше ошибок во время компиляции для вас.
Если вам действительно нужен контейнер, который не сохраняет тип внутреннего значения, вы можете использовать 'std :: unique_ptr'. Но объект такого типа означает «я ссылаюсь на некоторые важные данные, которые вы больше не знаете, как читать», поэтому для меня это кажется бессмысленным. –
gTcV
Но можем ли мы проверить тип любого объекта с помощью инструкции 'typeid', не так ли? –
@ Виталий Исаев. Главное требование состоит в том, что использование 'typeid' неявно означает, что вы должны включить' RTTI'. Также такие решения основаны на методах стирания типа C++, и я не знаю, насколько это повлияет на способность вашего «RTTI» дать правильный ответ. Например, http://stackoverflow.com/questions/5450159/type-erasure-techniques – user2485710