1 votos

Establecer un boost::variant que contenga punteros, dentro de un std::vector

Tengo un std::vector de tipo boost::variant que contiene punteros a tipos estándar incorporados.

En código

std::vector<boost::variant<int *, double *> > bv;
bv.resize(2);
int n = 42;
bv[0] = &n;
double d = 102.4;
bv[1] = &d;

Esto funciona bien, y puedo acceder a los valores del vector utilizando boost::get<int *> o boost::get<double *> .

Sin embargo, me preguntaba si podría establecer el valor de un elemento del vector directamente, en lugar de apuntarlo a una referencia. En otras palabras, me gustaría hacer algo como esto

*bv[0] = 42;
*bv[1] = 102.4;

pero esto no compila. ¿Alguien tiene un consejo sobre cómo hacer esto?

Gracias.

EDITAR:

Al parecer, no tengo suficientes puntos para responder a mi propia pregunta, así que pensé en poner mi solución en la pregunta original. Espero que esto ayude a alguien que se tropiece con esta página.

He pensado en responder a mi propia pregunta, por si le sirve a alguien. Escribí una clase visitante, que modifica lo que el puntero en la variante se refiere. Aquí está el código de la clase visitante (por supuesto, esto se puede hacer una clase templada).

class specific_visitor : public boost::static_visitor<>
{
public:
    explicit specific_visitor(int i) : i_num(i) { }
    explicit specific_visitor(double d) : d_num(d) { }

    void operator()(int * i) const
    {
        *i = i_num;
    }

    void operator()(double * d) const
    {
    *d = d_num;
    }
private:
    int i_num;
    double d_num;
};

Para utilizarlo en el vector de variantes de la pregunta original, he aquí el código:

int i_num = 34;
boost::apply_visitor(specific_visitor(i_num), bv[0]);
double d_num = 9.81;
boost::apply_visitor(specific_visitor(d_num), bv[1]);

0voto

Zrin Puntos 65

Si realmente necesita punteros, entonces la respuesta es no, no puedes, porque - probablemente - no hay una manera factible de asignar y posteriormente liberar la memoria necesaria.

Si necesita asignar la memoria para (¿casi?) todos los los valores, entonces boost::variant<int, double> es un camino a seguir.

Si necesita almacenar punteros a (¿casi?) todos los valores los valores y asignar memoria para una minoría de ellos, entonces necesitas una solución más compleja (de todos modos).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X