2011-02-08 20 views
5

¿Hay alguna manera de hacer esto? Espero que obtendrá la idea, estoy tratando de crear una lista por medio de pares recursivasboost :: variante problema recursivo

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

Respuesta

4

No. El punto de un impulso :: variante es que tiene un tamaño fijo, y no lo hace hacer asignación dinámica De esta manera, es similar a una unión. Un impulso recursivo :: variante tendría que tener un tamaño infinito para contener su mayor valor posible, claramente imposible.

Sin embargo, puede hacerlo pasándolo por un puntero. Por ejemplo:

struct nil { }; 

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

Perdón por 'traer el odio' un poco tarde, por así decirlo, pero acabo de toparme con esto por una pregunta relacionada. No hay necesidad de poner punteros en un boost.variant: el reiniciador recursive_variant usa un 'boost :: shared_ptr' internamente, por lo que su reclamo de 'tamaño infinito' es falso. El esquema basado en la pila no está garantizado y solo se usa si todos los constructores (para los parámetros de la plantilla) tienen un constructor de nohrow. Puede leer más sobre esto aquí: http://www.boost.org/doc/libs/1_46_1/doc/html/variant/design.html#variant.design.never-empty (busque 'copia de seguridad de pila temporal') . – phooji