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

Check at compile time if type is pointer

本文关键字:是否 指针 类型 检查 编译      更新时间:2023-10-16

我正在试图找到一种方法来判断一个类型在编译时是否是指针

#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;

谢谢
Matt

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

T pHead = T();

适用于大多数结构。

您可以为此使用模板:

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);