对于既不是 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&lt;T, Args&gt; 的形式,其中 Args 是零个或多个类型 论据; 否则,专业化不正确

【讨论】:

谢谢。你知道查询某种类型是否是“类似指针”的最佳方法是什么吗? @Johannes:定义“类似指针”。您可以通过表达式 SFINAE 创建某种概念。 检查element_type 的存在会得到标准的“类指针类型”,但由于SomePointer&lt;T, Args&gt; 形式的任何东西也是可以接受的,我不确定(标准也没有' t 似乎澄清了“类指针类型”的含义是 AFAICT)。 @JohannesSchaub-litb 查询是否不仅涉及琐碎(对std::is_pointer&lt;&gt; 的回答正确的东西),而且还可能覆盖或继承operator-&gt;()operator *()?这个问题看起来很有趣。 我明白了。我可能会提供明确的部分特化,因为在我看来,阻止匹配迭代器或其他愚蠢的非指针类型是不可能的。

以上是关于对于既不是 X<A, T...> 也不是成员 typedef element_type 的类型,pointer_traits 提供了啥?的主要内容,如果未能解决你的问题,请参考以下文章

模板矩阵加速(数列)

Fence(codeforces 232D)

三目运算符

算法复杂度

luogu 1939模板矩阵加速(数列)

python中__str__与__repr__