2017-02-10 57 views
1

泛型類型刪除值假設你有一個類,如:只有當它是一個指針

template<typename T> 
class Foo 
{ 
public: 
    T value; 
public: 
    Foo(const T& value) 
    { 
     this->value = value; 
    } 
public: 
    ~Foo() 
    { 
     if(std::is_pointer<T>::value) delete value; 
    } 
} 

現在,很明顯,如果T不是指針,編譯器將拋出一個錯誤。例如:

Foo<int> foo(42); 

有沒有辦法成功地檢查是否T是一個指針,刪除它,如果它是,沒有一個編譯器錯誤?

回答

0

使用專門的輔助類的東西大致如下:

template<typename T> class delete_me { 

public: 

    static void destroy(T &value) 
    { 
    } 
}; 

template<typename P> 
class delete_me<P *> { 

public: 

    static void destroy(P *value) 
    { 
     delete value; 
    } 
}; 

而且你的析構函數:

~Foo() 
{ 
    delete_me<T>::destroy(value); 
} 
0

簡單假設資源管理本身。如果您的T類型的變量沒有釋放資源,則認爲它是預期的行爲。

例如,如果您有一個非擁有指針,您傳遞給您的類模板,您不希望它刪除它,因爲指針是不擁有。

另一方面,std::unique_ptr將釋放它自動包含的指針。

假設你有一個單身Bar,具有如下功能:Bar::instance返回一個Bar*

// You don't want Foo to delete instance 
Foo<Bar*> foo{Bar::instance()}; 

但具有獨特的指針,它看起來就像這樣:

Foo<std::unique_ptr<Baz>> foo{std::make_unique<Baz>()}; 

指針到Baz將自行釋放,就像你想要的一樣。

TL; DR如果你只是簡單地移除你的析構函數,你已經有了最好的解決方案。

相關問題