У меня есть std :: vector типа boost :: option, который содержит указатели на стандартные встроенные типы.
В коде
std::vector<boost::variant<int *, double *> > bv;
bv.resize(2);
int n = 42;
bv[0] = &n;
double d = 102.4;
bv[1] = &d;
Это хорошо работает, и я могуполучить доступ к значениям в векторе, используя boost::get<int *>
или boost::get<double *>
.
Однако мне было интересно, смогу ли я установить значение элемента в векторе напрямую, вместо того, чтобы указывать его на ссылку.Другими словами, я хотел бы сделать что-то вроде этого
*bv[0] = 42;
*bv[1] = 102.4;
, но это не компилируется.Кто-нибудь есть советы о том, как это сделать?
Спасибо.
РЕДАКТИРОВАТЬ:
Очевидно, у меня недостаточно очков, чтобы ответить на свой вопрос, так что решилВместо этого я бы поставил свое решение в исходном вопросе.Надеюсь, это поможет кому-то, кто наткнется на эту страницу.
Я подумал, что отвечу на свой вопрос, если кому-то это поможет.Я написал класс посетителя, который изменяет то, на что ссылается указатель в варианте.Вот код для класса посетителя (конечно, это может быть шаблонный класс).
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;
};
Чтобы использовать его для вектора вариантов в исходном вопросе, вот код:
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]);