2011-02-08 11 views
5

Czy jest jakiś sposób, aby to zadziałało? Mam nadzieję, że masz pomysł, Próbuję utworzyć listę za pomocą rekurencyjnych parboost :: variant recursive trouble

#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; 
} 

Odpowiedz

4

opiniach Punktem boost :: wariant jest to, że ma stały rozmiar, a nie czy alokacja dynamiczna. W ten sposób jest podobny do związku. Wariant rekurencyjny :: wariant musiałby mieć nieskończoną wielkość, aby pomieścić jego największą możliwą wartość - wyraźnie niemożliwy.

Można to jednak zrobić, przesyłając wskaźnik. Na przykład:

struct nil { }; 

typedef boost::make_recursive_variant<nil, 
    std::pair<int, boost::scoped_ptr<boost::recursive_variant_> > > 
     variant_list_int; 
+9

Przepraszam za "sprowadzenie nienawiści" trochę późno, że tak powiem, ale właśnie natknąłem się na to z pokrewnego pytania. Nie ma potrzeby umieszczania wskaźników w boost.variant - opakowanie recursive_variant używa wewnętrznie 'boost :: shared_ptr', więc twój" nieskończony rozmiar "jest fałszywy. Schemat oparty na stosie nie jest gwarantowany i jest używany tylko wtedy, gdy wszystkie konstruktory (dla parametrów szablonu) mają konstruktor nonhrow. Więcej na ten temat można przeczytać tutaj: http://www.boost.org/doc/libs/1_46_1/doc/html/variant/design.html#variant.design.never-empty (poszukaj "tymczasowej kopii zapasowej sterty") . – phooji