当我将元素类型存储在另一个字符串向量中时,如何打印boost :: any的向量?

时间:2016-02-06 16:39:40

标签: c++ c++11 boost stl boost-any

  • 我使用boost :: any向量来存储不同的数据类型,从给定的程序文件构造符号表。
  • 我也将他们的数据类型存储在一个单独的向量中作为字符串。
  • 在尝试使用boost :: any_cast<>()打印boost :: any时, 如果我将存储为字符串的数据类型作为强制转换类型传递,则会收到bad_any_cast错误。
  • 如何克服这个障碍并使用我所拥有的字符串信息打印矢量。

    vector<boost::any> vany;
    vector<string> vtype;
    string vartype;
    
    vany.push_back(10);
    vtype.push_back("int");
    vany.push_back(2.5);
    vtype.push_back("float");
    vany.push_back("hello");
    vtype.push_back("string");
    
    for(int i=0; i<3; i++)
    {
        vartype = vtype[i];
        cout<<boost::any_cast<vartype>(vany[i]); //this doesn't work, how do i make it work?
    }        
    

1 个答案:

答案 0 :(得分:4)

C ++是一种静态类型语言。每个表达式都必须具有编译时所知的类型。

字符串(或任何非constexpr变量)的值在运行时中定义。因此,您无法对由字符串命名的类型执行强制转换。

any仅在您确切知道该特定值中存储的类型时才有用。你必须在编译时而不是运行时知道这一点。用于在发出价值的人和接收价值的人之间隐藏数据类型。但它不允许打破C ++的静态类型规则。

没有通用的解决方案能够在数组中存储任何类型,然后对它们执行任意操作。您可以开发类似any的类型,它可以使用对实际类型的多态访问来调用值operator<<。但你不能在any之外做到这一点。