我有一个类型为boost :: variant的std :: vector,它包含指向标准内置类型的指针。在std :: vector中设置包含指针的boost :: variant
在代码
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]);
为什么在这里首先使用指针? – 2012-02-08 17:50:14
好吧,我正在尝试将boost :: variant集成到一个更大的程序中,不幸的是,这是我现在唯一现实的选择。 – endbegin 2012-02-08 17:53:46
@endbegin:那对我没有意义。为什么'std :: vector>'使它不现实? –
kennytm
2012-02-08 17:55:22