boost:: variant рекурсивная проблема

есть ли способ сделать эту работу? Надеюсь, вы поняли, я пытаюсь создать список с помощью рекурсивных пар

#include <boost/variant.hpp>
#include <utility>

struct nil {};
typedef boost::make_recursive_variant<nil, std::pair<int, boost::recursive_variant_ >>::type list_t;

int main() {
  list_t list = { 1, (list_t){ 2, (list_t){ 3, nil() } } };
  return 0;
}

person Voivoid    schedule 08.02.2011    source источник


Ответы (1)


Нет. Смысл boost::variant в том, что он имеет фиксированный размер и не выполняет динамического распределения. В этом он подобен союзу. Рекурсивный boost::variant должен иметь бесконечный размер, чтобы содержать максимально возможное значение, что явно невозможно.

Однако вы можете сделать это, передав его через указатель. Например:

struct nil { };

typedef boost::make_recursive_variant<nil, 
    std::pair<int, boost::scoped_ptr<boost::recursive_variant_> > >
        variant_list_int;
person bdonlan    schedule 08.02.2011
comment
Извините за то, что, так сказать, «принес ненависть» немного поздно, но я только что столкнулся с этим из связанного вопроса. Нет необходимости помещать указатели в boost.variant - оболочка recursive_variant использует boost::shared_ptr внутри, поэтому ваше утверждение о «бесконечном размере» ложно. Схема на основе стека не гарантируется и используется только в том случае, если все конструкторы (для параметров шаблона) имеют конструктор nothrow. Подробнее об этом можно прочитать здесь: boost.org/doc/libs/1_46_1/doc/html/variant/ (ищите «временную резервную копию кучи»). - person phooji; 26.03.2011