2010-10-07 29 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