因此,我構建了一個類,我打算使用std::aligned_storage
來爲「變體」類存儲最多16個字節的不同類型。理論上它應該能夠存儲任何POD類型和普通容器,例如std::string
和std::map
。如何破壞通過「安置新」構建的無析者類型
我經過這裏找到的代碼示例,它看起來就像是爲正是我一直在尋找製作:http://en.cppreference.com/w/cpp/types/aligned_storage
我的版本,基本上是:
class Variant {
public:
Variant() { /* construct */ }
Variant(std::map<int,int> v) {
new(&m_data) std::map<int,int>(v); // construct std::map<int,int> at &m_data
m_type = TYPE_MAP;
}
~Variant() {
if (m_type == TYPE_MAP) {
// cool, now destruct..?
reinterpret_cast<std::map<int, int>*>(&m_data)->~/*???????????????*/();
}
}
private:
// type of object in m_data
enum Type m_type;
// chunk of space for allocating to
std::aligned_storage<16, std::alignment_of<std::max_align_t>::value>::type m_data;
};
我的問題自帶破壞。正如你可以在/*???????????????*/
看,我不知道該怎麼代替~T()
在cppreference.com例如撥打電話:
reinterpret_cast<const T*>(data+pos)->~T(); // I did the same thing except I know what T is, is that a problem is it?
在我心中,我在做同樣的事情,無論模板匿名。問題是,std::map
沒有任何std::map::~map()
析構方法,只有一個std::map::~_Tree
,這顯然不打算直接使用。因此,在cppreference.com示例代碼中,如果T
是std::map<int,int>
,~T()
會調用什麼,以及我如何調用std::aligned_storage
中已知類型的對象的析構函數的正確方法是什麼?還是我過於複雜的事情,並保證這些STL容器中的方法能保證等價於完全銷燬?
或者,有沒有更簡單的方法呢?由於我對std::aligned_storage
的預期用法可能誤解了一些內容。
是什麼讓你覺得沒有'std :: map ::〜map()'?當然有。 – Brian
啊,我要問的是,這與我的編譯器有什麼特別的關係,但是一定要編輯它。那麼,我在看Visual Studio 2015對C++ 11的支持嗎?因爲頭文件中幾乎肯定沒有...... @Brian – Deji
所有類都有析構函數(編譯器隱式聲明,如果不這樣做),還可以在非類類型上使用'〜T()'語法它被定義爲不可操作 –