测试 std::pointer_traits 是不是可以与我的类型一起使用

Posted

技术标签:

【中文标题】测试 std::pointer_traits 是不是可以与我的类型一起使用【英文标题】:Testing if std::pointer_traits can work with my type测试 std::pointer_traits 是否可以与我的类型一起使用 【发布时间】:2017-04-05 23:15:49 【问题描述】:

如何在编译时检查std::pointer_traits 是否可以使用任意类型?我曾希望一个简单的 SFINAE 解决方案可以工作:

template <typename T, typename = void>
struct pointer_traits_ready : std::false_type ;

template <typename T>
struct pointer_traits_ready<
         T,
         std::void_t<typename std::pointer_traits<T>::element_type>
       > : std::true_type ;

static_assert(!pointer_traits_ready<int>::value,"");

...但这会从标准库 (ptr_traits.h) 中调用静态断言。显然std::is_pointer 不支持智能指针。

【问题讨论】:

您可以尝试N4502中描述的检测技术。 【参考方案1】:

你不能。来自[pointer.traits.types]:

using element_type = see below ;

Type: Ptr::element_type 如果 qualified-id Ptr::element_type 是有效的并且表示一个类型 (14.8.2);否则,T 如果 PtrSomePointer&lt;T, Args&gt; 形式的类模板实例化,其中 Args 是 零个或多个类型参数; 否则,专业化不正确。

为了对 SFINAE 友好,我们需要 pointer_traits&lt;Foo&gt; 来简单地缺少名为 element_type 的类型别名。问题是,element_type 被指定为格式错误 - 并非不存在。因此,您根本不能使用pointer_traits 作为检测器来判断某物是否可以用作指针类型。

即使您编写了自己的类型,该类型是该规范的 SFINAE 友好版本,您也无法为自己的类型捕获 pointer_traits 的用户特化。悲伤的熊猫。

【讨论】:

用户专业化必须遵守标准的规则,在这种情况下这是非常严格的,不是吗? @Yakk 我想我可以写struct pointer_traits&lt;Foo&gt; using element_type = int; ;,只要我的Foo 取消引用? 我想我可以写一个std::less 专业化而不叫operator&lt;,但显然我错了......我不明白“你的专业化不能违反std" 子句中版本的保证(无论其措辞如何)以及它在此处的应用方式。您可能允许element_type=int 如果 Foo::element_typeint。我不认为这是故意的,但它可能是标准要求的。 @Barry 真可惜。感谢您的回答。

以上是关于测试 std::pointer_traits 是不是可以与我的类型一起使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Xcode 的单元测试框架,应用程序代码是不是可以确定它是不是作为单元测试运行?

根据测试是不是成功通过不同的测试计数

应用程序是不是可以通过 TestFlight 检测它是不是安装为“外部测试”

linux 怎样测试是不是能上网, 有两部分,1:是不是连接网线,2:是不是连接了INTERNET

谷歌是不是提供测试用户进行集成测试

django - 如何检测测试环境(检查/确定是不是正在运行测试)