真正的动态矢量打字

时间:2015-07-11 21:52:22

标签: c++ dictionary vector

是否有一种标准的方法来更改容器内的类型,如std :: vector? 这方面的一个例子是:

std::vector<std::string> v;

v.insert("hi");

然后以某种方式更改类型并添加:

v.insert(1);

非常类似于解释器语言如何在列表/数组中具有多种类型

我知道矢量本身并不是这样做的,但是如果不使用像boost这样的第三方库,我就会失去如何绕过它,即便如此,我也没有方向。

我创建了一个示例代码来展示一种键值数据方法。它确实有效,但中间的(非工作)评论部分是我试图实现的想法。

#include <iostream>
#include <iterator>
#include <vector>
#include <map>
#include <string>
#include <typeinfo>

using namespace std;

int main()
{
    typedef std::map<std::string, std::string> map_type;
    typedef std::vector<map_type> vector_type;
    typedef std::map<std::string, map_type> map_keyobj_type;
    vector_type stack;
    vector_type::iterator it = stack.begin();

    //First map
    map_type stringmap;
    stringmap.insert(map_type::value_type("I'm a string", "Also a String"));
    it = stack.insert(it, stringmap);

    //Second wanted map, example code of what is wanted
    /*
    map_keyobj_type secondlayer;
    map_type secondlayervalue;
    secondlayervalue.insert(map_type::value_type("String from inside map",     "That too string"));
    secondlayer.insert(map_keyobj_type::value_type("List", secondlayervalue));
    stack.insert(it, secondlayer);
    */

    map_type stringmap2;
    stringmap2.insert(map_type::value_type("String after map map", "Also string"));
    it = stack.insert(it, stringmap2);


    //prints stack, only supports map_type
    //Iterates backwards to get top-down input correct.
    for (int i = stack.size()-1; i > -1; --i)
    {
        //Print map_type
        if (typeid(stack[i]).name() == typeid(map_type).name())
        {
            for (map_type::const_iterator ite = stack[i].begin(); ite != stack[i].end(); ++ite)
            {
                cout << ite->first << " : " << ite->second << "\n";
            }
        }
    }

    //return 0;
}

2 个答案:

答案 0 :(得分:1)

你可以使用boost :: any,诀窍是你需要知道你保存了什么类型才能把它拿出来。如果你关心的话,这也是非常低效的,因为它会保存几个指针你的整数而不是整数。

您可以使用受歧视的联盟。这是一个包含枚举和联合的结构。枚举告诉你的代码在联合中保存了什么类型。

您提到了解释语言。他们中的大多数使用区别联合方法。在Python或Perl的SV中查看PyObject。

答案 1 :(得分:0)

我不确定这是最好的解决方案,但您可以尝试使用QVariant来实现此目的。如果您不能使用Qt,也许您应该为此目的实现自己的类。