【问题标题】:Restoring any type恢复任何类型
【发布时间】:2011-03-06 00:25:58
【问题描述】:

有没有办法恢复 boost::any 对象的打包类型?如果现在,我可以为它存储一些关联图吗?我需要类似(伪代码):

map<key, any> someMap;
someMap["Key"] = some own object;
getType("Key");

【问题讨论】:

    标签: c++ types store


    【解决方案1】:

    您是要获取值的类型,还是只是将其转换回原来的值?如果你只想投射它,只需使用boost::any_cast:

    boost::any val = someMap["Key"];
    RealType* r = boost::any_cast<RealType>(&val);
    

    【讨论】:

    • 我不知道真正的类型。在任何地图中都存储了不同的数据。我应该恢复每种类型。
    • 您需要 (a) 知道要恢复的类型; (b) 有办法确定您要恢复的类型;或者,(c)通过尝试每种可能的方法来猜测您要恢复的类型。是否所有可能的类型都派生自一个公共基类?
    【解决方案2】:

    不是随意的,你需要有一些你想在 C++ 中使用的静态类型。

    因此您可以使用any::type() 和any_cast() 测试或转换为特定类型,例如:

    const boost::any& any = someMap["Key"].type();
    if (int* i = boost::any_cast<int>(&any)) {
        std::cout << *i << std::endl;
    } else if (double* d = boost::any_cast<double>(&any)) {
    // ...
    

    但由于 C++ 是静态类型的,因此通常无法执行以下操作:

    magically_restore_type(someMap["Key"]).someMethod();
    

    在 C++ 中使用 boost::any 之类的东西几乎总是不是一个好主意,因为处理任意类型并不好玩。如果您只需要处理已知的有限类型集,请不要使用boost::any - 有更好的选择,例如boost::variant 或多态类。

    【讨论】:

    • 另一张有关联的地图怎么样?像键 -> 类型,键 -> 值。
    • @Ockonal:问题仍然存在,您必须明确处理可能存储的不同类型 - C++ 没有“运行时鸭子类型”。 any 已经有了类型信息,你只需要显式操作就可以了。
    【解决方案3】:

    假设您确实有这样一个函数来从 boost::any 中提取正确类型的提取。这个函数的返回值是多少?你的代码会是什么样子?

    // Extracts v and returns the correct type... except we can't do that in C++. Let's just call it MagicalValue for now.
    MagicalValue magic(const boost::any& v);
    
    void perform_magic(const boost::any& v)
    {
        MagicalValue r = magic(v);
        r.hello_world();    // Wait, what?
    }
    

    您不能在静态类型语言中进行这种类型的欺骗。您可以尝试的是多态性而不是 boost::any。这为您提供了一个可以在 C++ 中使用的通用接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 2017-08-21
      相关资源
      最近更新 更多