QVariant vs boost :: any vs boost :: option

Мне нужен эффективный способ хранения значений различных типов (int, float, QString или std :: string, bool) в одном из «универсальных» контейнеров, таких как QVariant.

Я хочу архивировать меньше использования памяти.

Я предпочитаю контейнер, который не хранит тип внутреннего значения, потому что это накладные расходы.

Какой я должен использовать?

3

Решение

boost::any может содержать значения любого типа, но вы должны знать, что он может содержать, чтобы иметь возможность извлечь значение, и он выделяет память в куче для сохраненного значения.

boost::variant с другой стороны, может хранить только значения набора указанных типов, и вы можете легко узнать, что он содержит, sizeof из boost::variant будет sizeof типа наибольшего значения содержит + некоторое дополнительное значение для типа хранимого значения, потому что оно не использует память кучи (если не используется рекурсивный вариант).

С точки зрения использования памяти boost::variant может быть более эффективным, потому что он не использует кучу памяти. Также, boost::variant более безопасен для типов, boost::any, компилятор может найти больше ошибок во время компиляции для вас.

3

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

Я сталкивался с подобным вопросом около года назад. Я не помню причины, но я пошел с повышением: любой. 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;
}

Надеюсь это поможет!!

-1

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