2012-02-08 41 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

相關問題