C++ 在编译时检查类型是否为指针

C++ 在编译时检查类型是否为指针,c++,visual-studio-2010,C++,Visual Studio 2010,我试图找到一种方法来判断类型在编译时是否是指针。这类似于: #include <type_traits> #if std::is_pointer<char*>::value #pragma message("blah") #endif T pHead; #if std::is_pointer<T>::value pHead= NULL; #endif #包括 #如果std::是_指针::值 #布拉格语信息(“废话”) #恩迪夫 但是,这会给出两次“警告C

我试图找到一种方法来判断类型在编译时是否是指针。这类似于:

#include <type_traits>
#if std::is_pointer<char*>::value
#pragma message("blah")
#endif
T pHead;
#if std::is_pointer<T>::value
pHead= NULL;
#endif
#包括
#如果std::是_指针::值
#布拉格语信息(“废话”)
#恩迪夫
但是,这会给出两次“警告C4067:预处理器指令后出现意外标记-需要换行符”(我认为::是混淆它的原因),并且它不会打印废话。当我使用hoover::值时,编译器会告诉我它是否为真,这意味着它在编译时是已知的,所以这应该可以工作

原因是我希望能够做这样的事情:

#include <type_traits>
#if std::is_pointer<char*>::value
#pragma message("blah")
#endif
T pHead;
#if std::is_pointer<T>::value
pHead= NULL;
#endif
tphead;
#如果std::是_指针::值
pHead=NULL;
#恩迪夫
其中,如果变量是指针,则为NULL。它必须是编译时检查,因为如果T是结构,则无法为其变量指定NULL。即,当T是结构时,以下代码将不会编译:

T pHead;
if (std::is_pointer<T>::value)
    pHead= NULL;
tphead;
if(std::is_指针::值)
pHead=NULL;
谢谢

Matt

您可以为此使用模板:

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

}

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

可以将变量初始化为其默认值,指针类型的默认值为NULL

T pHead = T();

也适用于大多数结构。

我认为
T
是一个泛型。我怀疑这会起作用。如果
T
int*
,怎么办?我将T视为模板参数或typedef。如果是,那么它会起作用。如果它实际上是
int*
,我们知道它是一个指针,可以将其设置为NULL。@Matt-如果你有
typedef int*T;
它确实有效。结构或模板参数也有效。正如Luchian指出的,T是泛型的,所以它可能是int*或struct,所以它不起作用。对不起,你是对的,在测试它确实起作用之后,我认为既然int*()不起作用,那么它就不起作用了。但是现在它为什么起作用呢?如果int*()不起作用,为什么它不起作用呢当T实例化为int*work?或者他可以使用。它应该是
voidfoo(A*&A)
@elmo我猜这基本上应用了相同的概念,对吧?谢谢,这很有效。我猜这是模板专门化,我不太了解它?@Matt-这不是模板专门化,只是两个重载函数恰好是模板。