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]);