2013-09-28 63 views
3

我想用C++代表使用变体的PDF对象类型。甲PDF目的是下列之一:C++相互递归变体类型

  • 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

回答

5

由于您使用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); 

而且它按预期工作。

+0

问题是数组和字典类型之间存在相互递归。这个例子只显示了如何在其自身的变体中嵌套'int_tree_t',但是我需要引用尚未定义的typedef – Ell

+1

@Ell:我没有看到这样的递归。两者都提到'Object',这是(我猜)你正在定义的变体,但我会认为'typedef boost :: make_recursive_variant ,Map > :: type Object;'会工作得很好。 –

+1

当然啊。我很抱歉,我没有看到我可以如何使用它,但我当然不需要typedef。非常感谢,并且我第一次没有看到这是解决方案的道歉! – Ell