2013-08-04 72 views
2

當使用std::shared_ptr<>有可能從shared_ptr<T>轉換爲shared_ptr<U>如果U爲T.像shared_ptr的隱式轉換<T>

的基礎

我試圖達到同樣的事情,我有一個封裝了指針模板類並且我希望同樣的派生到基礎的轉換工作,這是如何完成的?

  • 轉換構造
  • 轉換操作

例子:

回答

5

這可以通過兩種方式一個完成

template <typename T> 
class MyClass { 
public: 
    // converting constructor 
    template <typename U> 
    explicit MyClass(MyClass<U> const& other); 

    // converting operator 
    template <typename U> 
    explicit operator MyClass<U>() const; // explicit here is C++11 only 
}; 

如果兩者都做,雖然,你不幸的會有不明確的意思附件。就我個人而言,我發現轉換構造函數更容易(也更具慣用性),並且當我無法修改轉換後的類(不是我的代碼)時,保留使用轉換運算符的情況。

+0

謝謝!我仍然不確定shared_ptr <>只允許強制類型轉換,其中T是U的子類,但在我的特例中,我包裝了shared_ptr <>,所以編譯器無論如何都會抱怨。 – Kazade

+0

@Kazade:你有兩個解決方案。 'std :: shared_ptr '封裝了一個'T *',所以當從'U *'賦值給'T *'時,編譯器會自然地檢查轉換並且在不可能的情況下投訴;唯一的缺點是模板中可能存在深度錯誤。另一種解決方案是用SFINAE檢查明確地保護構造函數;編寫起來會更復雜,並且存在這樣的問題,即它從構建過程中刪除了構造函數,這可能會導致更奇怪的錯誤消息。 –

相關問題