2012-01-08 75 views
2

我“米试图找到一种方法来判断一个类型是在编译时的指针是这样的:检查在编译的时候,如果类型为指针

#include <type_traits> 
#if std::is_pointer<char*>::value 
#pragma message("blah") 
#endif 

然而,这给”警告C4067:预处理器指令后的意外令牌 - 期待换行符“两次(我认为::是什么让它混淆了),它不打印等等,当hoover over :: value时,编译器告诉我它是否为真,这意味着它是已知在编译时间所以这应该工作

这是因为我想能够做这样的事情:

T pHead; 
#if std::is_pointer<T>::value 
pHead= NULL; 
#endif 

其中,如果它是指针,则为NULL。它必须是编译时检查,因为如果T是一个结构体,我不能将NULL赋值给它的变量。即下面的代码将不能编译当T是一个结构:

T pHead; 
if (std::is_pointer<T>::value) 
    pHead= NULL; 

感谢
马特

回答

4

您可以将变量初始化为它的默认值,对于指针类型它是NULL。

T pHead = T(); 

适用于大多数结构。

+0

我觉得'T'是一个通用的。我怀疑这会起作用。如果'T'是'int *'呢? – 2012-01-08 11:30:52

+0

我将T看作模板参数或typedef。如果是的话,它会起作用。如果它实际上是'int *',我们知道它是一个指针,可以将它设置为NULL。 – 2012-01-08 11:34:10

+0

@Matt - 如果你有'typedef int * T;'它*不工作。像结构或模板参数一样。 – 2012-01-08 12:05:21

3

您可以使用模板此:

template<typename A> 
void foo(A a) 
{ 

} 

template<typename A> 
void foo(A*& a) 
{ 
    a = NULL; 
} 

调用foo的指针类型将进入第二个功能,否则是第一个功能。

你不能用预处理指令来做,因为顾名思义,这是在编译之前发生的。

但是在编译期间会发生模板分辨率,所以您可以使用此解决方案。

我假设你已经在使用的模板,因为你的代码还提供了一个泛型类型:

T pHead; 
#if std::is_pointer<T>::value 
pHead= NULL; 
#endif 

你可以使用

T pHead; 
foo(pHead); 
+0

或者他可以使用[boost :: is_pointer](http://www.boost.org/doc/libs/1_48_0/libs/type_traits/doc/html/boost_typetraits/reference/is_pointer.html)。 – elmo 2012-01-08 11:34:48

+0

它应该是'void foo(A *&a)'。 – 2012-01-08 11:35:44

+0

@GeorgFritzsche你是对的,我编辑了我的答案。谢谢! – 2012-01-08 11:37:30