2017-04-16 67 views
2

我目前正在研究一個項目,該項目需要我有一個向量存儲指向同一類但具有不同模板值的對象的指針。我想用shared_ptrs的,我不會太深入到(主要是,如果我想共享兩個ColumnLists之間的列)的原因。將shared_ptr <void>投射到shared_ptr時的行爲智能指針<type>

我需要能夠從一個函數返回一個指針鑄造(如下圖所示)。

所以這是一個非常簡化的版本:

template <typename ColType> 
class Column { 
    std::vector<ColType>; 
}; 

template <typename ...TypesOfColumns> 
class ColumnList { 

private: 
    std::vector< std::shared_ptr<void> > columnsVector; 
    /* Needs to have a vector storing pointers to multiple Columns 
     all with different template values */ 

public: 
    template <typename ReturnType> std::shared_ptr<ReturnType> GetPointer(int index) 
    { 
     return std::static_pointer_cast<ReturnType>(columnsVector.at(index)); 
    }; 

}; 

我,如果我得到某種類型的這裏未定義行爲不知道?它會工作,因爲我希望:將返回鑄造類型只需添加一個到虛擬指針的強參考計數器?一個可以在另一個之前被刪除嗎?我冒着內存泄漏的風險,其中一個被刪除,另一個沒有(我懷疑這是一個例子)?

一如往常,感謝所有的幫助!

+0

[codereview.se] – cpplearner

+0

@cpplearner我不同意。 「這個代碼有效,我可以做得更好」適合於CR。 「這段代碼似乎有用,但它真的」不是。 – Quentin

回答

2

static_pointer_cast遵循的static_cast做同樣的規則。是合法的一個指針到基部向下轉換到一個指針到衍生只要derivedbase導出。只要你確信columnsVector.at(index)包含shared_ptr<ReturnType>(即,包含shared_ptr<void>起源爲shared_ptr<ReturnType>),你在做什麼是合法的。如果你不確定,你應該使用dynamic_pointer_cast。

此外,關於記憶,static_pointer_cast股輸出相同的底層控制塊作爲輸入,因此它是安全的這樣了。即使輸入要先被刪除,輸出仍然是共享資源的合法所有者,反之亦然。

+0

太棒了,第二張圖真的很有幫助!非常感謝! –

2

IMO好得多將具有抽象列作爲基類爲模板:

struct AbstractColumn { 
    virtual ~AbstractColumn() {} 
    ... 
}; 

template<typename Type> 
struct Column : AbstractColumn { 
    std::vector<Type> data; 
}; 

這將提供一個地方,把通用的方法(例如轉化成字符串,從字符串等解析)也將允許您使用指針的基類,而不是指針到void

+1

我會明確地移動(或至少增加)虛擬析構函數'AbstractColumn' – Zereges

+0

@Zereges:其實它的意思是確實存在的,固定。 – 6502

相關問題