2012-01-18 43 views
0

快速的問題:指針的std ::性病載體::向量

是否有可能使該可以引用std::vector<std::vector<int> >std::vector<std::vector<double>>指針?

THX

+0

你會想什麼用那個指針呢?即在什麼情況下有一個指針可能指向一個'std :: vector >'或一個'std :: vector >'? – 2012-01-18 15:55:11

+0

你的意思是可以指向其中任何一個的指針嗎? – MikMik 2012-01-18 15:58:37

+0

是的,這就是我的意思! – 2012-01-18 16:02:56

回答

2

如果使用boost是一個選項,您可以使用boost:variant。從技術上講,它不是一個指針,而是一個類型安全的單件容器,但它應該能夠完成工作,而無需訴諸於使用void*的「大槍」方式。

2

如果你必須可以使用聯盟構建

union intordouble 
{ 
    int x; 
    double d; 
}; 

int main() 
{ 
    vector<intordouble> v; 
    return 0; 
} 

基本上矢量總是工會intordouble的讓你有一個指向它並不需要區分。請看Is it a good practice to use unions in C++?

+0

他們是否有任何使用該禁忌的禁忌? – 2012-01-18 16:09:13

+0

@MatthieuRiegler請參閱我的編輯 – 2012-01-18 16:11:46

+1

如果沒有某種方式知道當前在哪個類型中,則不能使用該聯合。如果任何向量中的所有元素都是相同的類型,則可以向該向量添加一個額外的數據成員以指示它包含的類型。如果你想在單個數組中存儲異構元素,那麼你需要使用(或重新創建)'boost :: variant'。 – 2012-01-18 16:38:47

1

void*可以指向任一個,但必須在使用前轉換爲正確的類型。

類型指針只能指向指定的類型,包括從它繼承的類型。 vector的不同專長是不同的類型,並且不共享公共基類,因此沒有類型化的指針可以指向這兩者。

如果這確實是您認爲需要做的事情,您可以考慮使用區分的聯合,如boost::variant來保存各種不同的指針類型。

1

<bad_guy_mode>

typedef std::vector<std::vector<int>>* vvi_ptr; 
typedef std::vector<std::vector<double>>* vvd_ptr; 

union int_or_double_vecs{ 
    vvi_ptr int_vector; 
    vvd_ptr double_vector; 
}; 

(請注意,只有一個成員是一次訪問,這是唯一一個你設置最後。)

</bad_guy_mode>