2012-02-08 72 views
1

我有一个类型为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]); 
+4

为什么在这里首先使用指针? – 2012-02-08 17:50:14

+0

好吧,我正在尝试将boost :: variant集成到一个更大的程序中,不幸的是,这是我现在唯一现实的选择。 – endbegin 2012-02-08 17:53:46

+3

@endbegin:那对我没有意义。为什么'std :: vector >'使它不现实? – kennytm 2012-02-08 17:55:22

回答

0

如果你真的需要指针,然后 答案是否定的,你不能, ,因为 - 很可能 - 没有可行的方式来分配和随后释放所需的内存。

如果您需要为内存分配(几乎?)所有的 的值,那么boost::variant<int, double>是 的一种方式。

如果你需要存储指针(几乎?)所有的 的值,并为它们中的少数分配内存, ,那么你需要一个更复杂的解决方案(无论如何)。

+0

我想我只需要一种方法来设置变量指针指向的值。例如,变量中的int *指向一个包含整数的位置,并且程序的其他部分指向该位置。所以在变体中,如果我可以改变那个位置的内容,那我就没事了。 – endbegin 2012-02-08 20:14:26

+0

代码的哪部分将为该值分配内存? 哪里 - 堆,堆栈,静态数据? 什么代码的部分后来变得太自由了? 在我看来,你需要'boost :: variant '为你分配空间,然后你可以设置这些值并获取它们的地址以获得你需要的指针给程序的其他部分。 – Zrin 2012-02-08 20:50:49

+0

顺便说一句,是否有一个特殊的原因,不存储在double类型的整数--8个字节的double可以完美存储整数,至少达到10^15(我认为是52位)的数量级。 – Zrin 2012-02-08 21:02:08

相关问题