如果type是指针,则在编译时检查

时间:2012-01-08 11:17:40

标签: c++ visual-studio-2010

我试图找到一种方法来判断类型是否是编译时的指针。就像这样:

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

然而,这给出了“警告C4067:预处理器指令之后的意外令牌 - 预期换行符”两次(我认为::是混淆了它)并且它不打印等等。当我翻过:: 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;

感谢
马特

2 个答案:

答案 0 :(得分:4)

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

T pHead = T();

适用于大多数结构。

答案 1 :(得分: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);