Установка boost :: variable, содержащего указатели, внутри std :: vector - PullRequest
1 голос
/ 08 февраля 2012

У меня есть 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]);

1 Ответ

0 голосов
/ 08 февраля 2012

Если вам действительно нужны указатели, тогда ответ нет, вы не можете, потому что - скорее всего - не существует подходящего пути выделить и затем освободить необходимую память.

Если вам нужно выделить память (почти?) Для всех значения, то boost::variant<int, double> путь.

Если вам нужно хранить указатели на (почти?) Все значения и выделить память для меньшинства из них, тогда вам нужно более сложное решение (во всяком случае).

...