2013-09-28 3 views
3

Я пытаюсь представить тип объекта PDF в C++ с использованием вариантов. Объект 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

Смежные вопросы