C++ 相互递归变体类型

Posted

技术标签:

【中文标题】C++ 相互递归变体类型【英文标题】:C++ Mutually Recursive Variant Type 【发布时间】: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 的要求,它无法编译

【问题讨论】:

【参考方案1】:

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

recursive_variant recursive_wrapper

您可以在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 不起作用。在这种情况下,我想您将不得不切换到基于访问者的方法。

以上是关于C++ 相互递归变体类型的主要内容,如果未能解决你的问题,请参考以下文章

让 static_visitor 在遍历 Boost 递归变体时对其进行修改?

相互递归的类

为递归变体编写 boost::variant 访问者

如何在 mpl::list 中声明 boost 递归变体?

c++头文件相互包含

背包问题变体的递归关系?