2010-10-07 158 views
0

可能重複:
Determine if Type is a pointer in a template functionC++模板類型是否爲指針或不

我正在尋找一種方法來確定一個模板是否是一個指針或不編譯時間。因爲當T不是指針時,程序將無法編譯,因爲您無法刪除正常類型的變量。

template <typename T> 
void delete(T &aVar) 
{ 
    // if T is a point 
    delete aVar; 
    aVar = 0; 
    // if T is not a point, do nothing 
} 

基本上,我學習到創建鏈接列表(不使用STL的list)自己。我試圖在我的列表中使用模板,因此它可以採用任何類型。當類型是一個指針時,我想通過析構函數自動刪除它(關鍵字delete)。

問題是,正如上面所寫,當我使用int而不是列表中的某個類的某個指針時,VC2010將無法​​編譯,因爲您無法刪除無指針變量。所以我正在尋找一種方法,如宏應該在刪除aVar時根據模板類型進行編譯或刪除

+0

你的意思是'operator delete'或'delete_something'? 'delete'是一個關鍵字。 – Potatoswatter 2010-10-07 16:06:08

+0

歡迎來到SO :)請使用「101010」按鈕或4空格縮進代碼將其標記爲代碼。就像我剛剛爲你做的那樣:) – 2010-10-07 16:10:42

+0

我不明白這是什麼東西的重複?無論如何,在這種情況下可能只需要兩個重載(一個對非指針沒有任何作用)。也許這個班正在努力做太多 - 畢竟也許我不想讓班級管理我的指針? – UncleBens 2010-10-07 16:30:59

回答

2

這是一個方便的實用程序,但我認爲最好是在使用後指定NULL本地delete

要獲得只被認爲是修改指針類型參數的函數,使用

template< typename T > // The compiler may substitute any T, 
void delete_ref(T *&arg); // but argument is still a pointer in any case. 

要簡單地找出一個類型是否爲指針,以升壓,TR1,或C使用is_pointer<type_traits> ++ 0X。

+0

感謝is_pointer,我將嘗試重載我的類並使用is_pointer來確定使用哪一個,指針是否指向一個指針。 – HideTail 2010-10-07 16:39:44

+0

@HideTail:你不需要檢查任何東西。重載分辨率自動決定調用哪個函數。 http://codepad.org/AgTVISzv – UncleBens 2010-10-07 17:05:43

3

如何讓該函數取代T *而不是T?

+1

+1,或者,爲了他的目的,T * – sellibitze 2010-10-07 16:14:12