我试图找到一种方法来判断类型是否是编译时的指针。就像这样:
#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;
感谢
马特
答案 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);