【问题标题】:C++ Mutually Recursive Variant TypeC++ 相互递归变体类型
【发布时间】:2013-09-28 12:26:30
【问题描述】:

我正在尝试使用变体在 c++ 中表示 PDF 对象类型。 PDF 对象是以下之一:

  • Boolean
  • Integer
  • Real
  • String
  • Name
  • Stream
  • Array<Object>
  • Map<Object, Object>

如您所见,Object 类型是相互递归的,因为Array 类型需要声明Map 类型,而这需要声明Array 类型。我怎么能在 C++ 中表示这种类型?如果变体不是最好的方法,那是什么?

这是我到目前为止尝试过的,但由于std::unordered_map(我认为)http://coliru.stacked-crooked.com/a/699082582e73376e 的要求,它无法编译

【问题讨论】:

    标签: c++ recursion types boost-variant mutual-recursion


    【解决方案1】:

    既然您使用的是boost::variant,那么使用它的递归包装器有什么问题?

    您可以在tutorial 中看到一个简短的示例:

    typedef boost::make_recursive_variant<
          int
        , std::vector< boost::recursive_variant_ >
        >::type int_tree_t;
    
    std::vector< int_tree_t > subresult;
    subresult.push_back(3);
    subresult.push_back(5);
    
    std::vector< int_tree_t > result;
    result.push_back(1);
    result.push_back(subresult);
    result.push_back(7);
    
    int_tree_t var(result);
    

    它按预期工作。

    【讨论】:

    • 问题是数组和字典类型之间存在相互递归。这个例子只展示了如何将int_tree_t 嵌套在自身的一个变体中,但是我需要引用一个尚未定义的 typedef
    • @Ell:我没有看到这样的递归。两者都引用Object,这是(我猜)您定义的变体,但我认为typedef boost::make_recursive_variant&lt;Boolean, Integer, ..., Array&lt;boost::recursive_variant_&gt;, Map&lt;boost::recursive_variant_, boost::recursive_variant_&gt;&gt;::type Object; 可以正常工作。
    • 啊当然。对不起,我没有看到如何使用它,但我当然不需要 typedef。非常感谢您,我很抱歉没有第一次看到这是解决方案!
    • @Ell:你不必为此感到抱歉 :)
    • @AntonK:我很惊讶get 不起作用。在这种情况下,我想您将不得不切换到基于访问者的方法。
    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    相关资源
    最近更新 更多