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
,那么使用它的递归包装器有什么问题?
您可以在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<Boolean, Integer, ..., Array<boost::recursive_variant_>, Map<boost::recursive_variant_, boost::recursive_variant_>>::type Object;
可以正常工作。
啊当然。对不起,我没有看到如何使用它,但我当然不需要 typedef。非常感谢您,我很抱歉没有第一次看到这是解决方案!
@Ell:你不必为此感到抱歉 :)
@AntonK:我很惊讶get
不起作用。在这种情况下,我想您将不得不切换到基于访问者的方法。以上是关于C++ 相互递归变体类型的主要内容,如果未能解决你的问题,请参考以下文章