Мне нужен эффективный способ хранения значений различных типов (int, float, QString или std :: string, bool) в одном из «универсальных» контейнеров, таких как QVariant.
Я хочу архивировать меньше использования памяти.
Я предпочитаю контейнер, который не хранит тип внутреннего значения, потому что это накладные расходы.
Какой я должен использовать?
boost::any
может содержать значения любого типа, но вы должны знать, что он может содержать, чтобы иметь возможность извлечь значение, и он выделяет память в куче для сохраненного значения.
boost::variant
с другой стороны, может хранить только значения набора указанных типов, и вы можете легко узнать, что он содержит, sizeof
из boost::variant
будет sizeof
типа наибольшего значения содержит + некоторое дополнительное значение для типа хранимого значения, потому что оно не использует память кучи (если не используется рекурсивный вариант).
С точки зрения использования памяти boost::variant
может быть более эффективным, потому что он не использует кучу памяти. Также, boost::variant
более безопасен для типов, boost::any
, компилятор может найти больше ошибок во время компиляции для вас.
Я сталкивался с подобным вопросом около года назад. Я не помню причины, но я пошел с повышением: любой. boost: any хранит typeid, который можно использовать для получения значения в желаемом формате.
Вот пример:
#include <iostream>
#include <boost/any.hpp>
#include <string>
int main()
{
boost::any value;
for(int i=0; i < 3; i++)
{
switch (i)
{
case 0:
value = (double) 8.05;
break;
case 1:
value = (int) 1;
break;
case 2:
//std::string str = "Hello any world!";
//value = str;
value = std::string("Hello any world!");
break;
}
if(value.type() == typeid(double))
std::cout << "it's double type: " << boost::any_cast<double>(value) << std::endl;
else if(value.type() == typeid(int))
std::cout << "it's int type: " << boost::any_cast<int>(value) << std::endl;
else if(value.type() == typeid(std::string))
std::cout << "it's string type: " << boost::any_cast<std::string>(value) << std::endl;
}
return 0;
}
Надеюсь это поможет!!