2013-09-28 93 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