簡體   English   中英

Union vs. static_cast(void*)

[英]Union vs. static_cast(void*)

我正在編寫代碼,直到現在我使用的是這樣的結構:

struct s{
  enum Types { zero = 0, one, two };
  unsigned int type;
  void* data;
} 

我需要一些通用結構來存儲來自不同類的數據,我想在 std::vector 中使用它,所以這就是我不能使用模板的原因。 什么是更好的選擇:聯合或空指針?

空指針只分配我需要的空間,但出於某種原因,c++ 是強類型語言,並且在我需要使用這些數據的任何地方進行強制轉換並不是 c++ 代碼應該設計的方式。 正如我所讀到的,除非別無選擇,否則不應使用 void 指針。

那個替代方案可能是工會。 它們隨 C++ 一起提供,並為每個成員使用相同的內存空間,非常類似於 void 指針。 然而,它們是有代價的——分配的空間是聯合中最大元素的大小,在我的情況下,大小之間的差異很大。

這是一個相當風格化和“正確使用語言”的問題,因為這兩種方式都完成了我需要做的事情,但我無法決定風格化的 C++ 代碼是否可以為浪費的內存買單(即使現在內存不是很大憂慮)。

如果要存儲異構類型的對象,請考慮boost::anyboost::variant

在決定使用哪個之前,先看看比較:

希望它能幫助您做出正確的決定。 從標准庫中選擇一個和任何容器來存儲對象, std::vector<boost::any>std::vector<boost::variant> ,或任何其他。

boost::variant

基本上,它是一個類型安全的聯合,在這種情況下,聯合似乎是迄今為止最合適的答案。 可以使用void* ,但這意味着動態分配,您必須維護Types enum和用於轉換的表。

內存限制可能使void*成為可接受的選擇,但這不是“簡潔”的答案,並且在boost::variant和簡單的union都被證明是不可接受的之前,我不會選擇它。

如果你的類有足夠多的共同點可以放在同一個容器中,給它們一個帶有虛析構函數的基類,可能還有一個虛成員函數來檢索你的類型代碼,即使在這一點上不僅 dynamic_cast 更合適,而且探索您的類是否沒有足夠的共同點來為它們提供更完整的公共接口可能是合理的。

否則,請考慮提供一個帶有適當類型數據成員的自定義容器類,以保存您需要放入其中的所有不同類的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM