Рекурсивный Typedef в C++

Я хочу написать определение типа на С++, но не знаю, законно ли что-то, что я хочу реализовать. Допустим, я хочу сделать typedef вектора типов вариантов повышения, которые указывают на int или другой вектор того же типа. Итак, будет ли это законным и будет ли компилятор жаловаться?

typedef std::vector<boost::variant<int *, boost::variant<int *, IntBranch*>> IntBranch;

person user1876508    schedule 07.04.2013    source источник
comment
Если компилятор жалуется, вы узнаете, когда попробуете, и он выдаст ошибку.   -  person chris    schedule 07.04.2013
comment
Компилятор не будет жаловаться, но, боюсь, это не сделает то, что вы хотите.   -  person Andy Prowl    schedule 07.04.2013
comment
@AndyProwl, это не выдаст ошибку о том, что вы еще не видели IntBranch? Что-то вроде этого?   -  person chris    schedule 07.04.2013
comment
@chris: Верно, извини. Я не прокрутил полностью вправо. Мой плохой, я отстой и т.д. :)   -  person Andy Prowl    schedule 07.04.2013


Ответы (1)


Вы можете использовать boost::make_recursive_variant для этой цели:

#include <boost/variant.hpp>

typedef boost::make_recursive_variant<
   int*, 
   std::vector< boost::recursive_variant_ >
>::type IntBranch;

И вот как вы будете его использовать:

#include <vector>

int main()
{
    typedef boost::make_recursive_variant<
       int*, 
       std::vector< boost::recursive_variant_ >
    >::type IntBranch;

    int x = 42;
    IntBranch ib = &x;

    std::vector<IntBranch> v;
    v.push_back(ib);

    IntBranch ib2 = v;

    // ...
}

А вот и живой пример.

person Andy Prowl    schedule 07.04.2013
comment
@chris: На самом деле recursive_wrapper дает еще больший контроль, но в этом случае make_recursive_variant должно быть достаточно - person Andy Prowl; 07.04.2013
comment
Большое спасибо за публикацию этого кода. К сожалению, у меня возникли некоторые проблемы с пониманием того, как пройти через это дерево. Допустим, у меня есть IntBranch с целыми числами, заполненными до позиции i, а затем в позиции i находится другой вектор. Как мне обойти такое дерево, введя какой-то вектор положения? - person user1876508; 08.04.2013
comment
@ user1876508: Вы можете сделать это более или менее так, как я показываю в живом примере, указанном в ответе. Или вы можете определить посетителя, наследующего от boost::static_visitor. Документация Boost.Variant подробно объясняет это. - person Andy Prowl; 08.04.2013
comment
Я не понимаю, как это сделать, и документация мне не помогает. Я переместил этот вопрос сюда, stackoverflow.com/questions/15907187/ . Спасибо, что нашли время, чтобы помочь мне. К сожалению, около месяца назад я окунулся в мир C++, и мне было сложно привыкнуть к чтению документации по boost. - person user1876508; 09.04.2013