2011-02-08 2 views
5

c'è un modo per farlo funzionare? Spero che l'idea, sto cercando di creare una lista per mezzo di coppie ricorsiveboost :: 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; 
} 

risposta

4

No. Il punto di un boost :: variante è che ha una dimensione fissa, e non lo fa fare allocazione dinamica. In questo modo è simile a un sindacato. Un boost ricorsivo: la variante dovrebbe avere dimensioni infinite per contenere il suo più grande valore possibile, chiaramente impossibile.

Si potrebbe, tuttavia, farlo passando attraverso un puntatore. Ad esempio:

struct nil { }; 

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

Mi dispiace per "portare l'odio" un po 'in ritardo, per così dire, ma mi sono imbattuto in questo da una domanda correlata. Non c'è bisogno di mettere i puntatori in un boost.variant - il wrapper recursive_variant usa internamente un 'boost :: shared_ptr', quindi la tua richiesta 'dimensione infinita' è falsa. Lo schema basato sullo stack non è garantito e viene utilizzato solo se tutti i costruttori (per i parametri del modello) hanno un costruttore nothrow. Puoi leggere ulteriori informazioni al riguardo qui: http://www.boost.org/doc/libs/1_46_1/doc/html/variant/design.html#variant.design.never-empty (cerca "backup di heap temporaneo") . – phooji