QVariant vs boost :: any vs boost :: variant

时间:2014-02-06 19:30:24

标签: c++ boost boost-variant qvariant boost-any

我需要有效的方法将不同类型的值(int,float,QString或std :: string,bool)存储在像QVariant这样的“通用”容器中。

我想存档较少的内存使用量。

我更喜欢不存储内部值类型的容器,因为它是一种开销。

我应该使用哪一个?

2 个答案:

答案 0 :(得分:3)

boost::any可以保存任何类型的值,但是您必须知道它能够提取的值才能提取值,并在堆上为存储的值分配内存。

另一方面,

boost::variant只能存储一组指定类型的值,您可以轻松找到它所包含的内容,sizeof的{​​{1}}将是它包含的最大值类型的boost::variant +存储值类型的一些额外值,因为它不使用堆内存(除非使用递归变量)。

从内存使用角度来看,sizeof可能更有效,因为它不使用堆内存。此外,boost::variantboost::variant更加类型安全,编译器可以在编译时为您找到更多错误。

答案 1 :(得分:-1)

一年前我遇到过类似的问题。我不记得推理,但我已经加强了推动:任何。 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;
}

希望这会有所帮助!!