在编译时检查类型是否为指针
Check at compile time if type is pointer
我正在试图找到一种方法来判断一个类型在编译时是否是指针
#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);
相关文章:
- std::vector::迭代器是否可以合法地作为指针
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 返回指向对象的指针的函数调用是否为 prvalue?
- 对象初始化中是否允许指向此成员的指针?
- 新分配指向函数的指针是否合法?
- 在函数结束后使用指向变量的指针是否安全?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 是否可以使用函数指针调用虚拟析构函数?
- std::less是否应该允许在编译时比较不相关的指针?
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 检查输入 std::array 指针数据是否等于某个常量数组
- 成员访问是否在空指针上定义C++?
- 如果只有 std::auto_ptr 可用,我是否仍应该使用智能指针?
- 是否可以使用指针访问变量以避免直接编辑变量?
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- "this"指针的值在对象的生存期内是否恒定?