对于既不是 X<A, T...> 也不是成员 typedef element_type 的类型,pointer_traits 提供了啥?
Posted
技术标签:
【中文标题】对于既不是 X<A, T...> 也不是成员 typedef element_type 的类型,pointer_traits 提供了啥?【英文标题】:What does pointer_traits provide for types that are neither X<A, T...> nor provide a member typedef element_type?对于既不是 X<A, T...> 也不是成员 typedef element_type 的类型,pointer_traits 提供了什么? 【发布时间】:2013-03-11 21:47:20 【问题描述】:跟随的结果是什么?它是不规范的、未定义的行为还是定义明确且规范的?
struct A ;
std::pointer_traits<A> x;
我问的原因是因为我想知道好奇,因为我想知道任意类型是否是指针。有了这个,我还意味着包括 shared_ptr 和朋友。我想知道是否有一个类型特征(谓词),或者如果没有,我是否可以使用 pointer_traits 并检测 element_type 是否被声明。
【问题讨论】:
【参考方案1】:它说它从 20.6.3p1 开始格式错误,因为它没有 element_type
并且不是类模板实例化
typedef 见下文 element_type;
类型:Ptr::element_type 如果这样 类型存在;否则,如果 Ptr 是一个类模板实例化,则为 T
SomePointer<T, Args>
的形式,其中 Args 是零个或多个类型 论据; 否则,专业化不正确。
【讨论】:
谢谢。你知道查询某种类型是否是“类似指针”的最佳方法是什么吗? @Johannes:定义“类似指针”。您可以通过表达式 SFINAE 创建某种概念。 检查element_type
的存在会得到标准的“类指针类型”,但由于SomePointer<T, Args>
形式的任何东西也是可以接受的,我不确定(标准也没有' t 似乎澄清了“类指针类型”的含义是 AFAICT)。
@JohannesSchaub-litb 查询是否不仅涉及琐碎(对std::is_pointer<>
的回答正确的东西),而且还可能覆盖或继承operator->()
和operator *()
?这个问题看起来很有趣。
我明白了。我可能会提供明确的部分特化,因为在我看来,阻止匹配迭代器或其他愚蠢的非指针类型是不可能的。以上是关于对于既不是 X<A, T...> 也不是成员 typedef element_type 的类型,pointer_traits 提供了啥?的主要内容,如果未能解决你的问题,请参考以下文章