在std :: vector中设置包含指针的boost :: variant

时间:2012-02-08 17:44:33

标签: c++ boost boost-variant

我有一个类型为boost :: variant的std :: vector,它包含指向标准内置类型的指针。

代码

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 :(得分:0)

如果你真的需要指针,那么 答案是否定的,你不能, 因为 - 很可能 - 没有可行的办法 分配并稍后释放所需的内存。

如果你需要为(几乎?)所有人分配内存 值,然后是boost::variant<int, double> 一种方法。

如果你需要存储指针(几乎?)全部 价值并为少数人分配记忆, 那么你需要一个更复杂的解决方案(无论如何)。

相关问题