测试 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-idPtr::element_type
是有效的并且表示一个类型 (14.8.2);否则,T
如果Ptr
是SomePointer<T, Args>
形式的类模板实例化,其中 Args 是 零个或多个类型参数; 否则,专业化不正确。
为了对 SFINAE 友好,我们需要 pointer_traits<Foo>
来简单地缺少名为 element_type
的类型别名。问题是,element_type
被指定为格式错误 - 并非不存在。因此,您根本不能使用pointer_traits
作为检测器来判断某物是否可以用作指针类型。
即使您编写了自己的类型,该类型是该规范的 SFINAE 友好版本,您也无法为自己的类型捕获 pointer_traits
的用户特化。悲伤的熊猫。
【讨论】:
用户专业化必须遵守标准的规则,在这种情况下这是非常严格的,不是吗? @Yakk 我想我可以写struct pointer_traits<Foo> using element_type = int; ;
,只要我的Foo
取消引用?
我想我可以写一个std::less
专业化而不叫operator<
,但显然我错了......我不明白“你的专业化不能违反std" 子句中版本的保证(无论其措辞如何)以及它在此处的应用方式。您可能仅允许element_type=int
如果 Foo::element_type
是int
。我不认为这是故意的,但它可能是标准要求的。
@Barry 真可惜。感谢您的回答。以上是关于测试 std::pointer_traits 是不是可以与我的类型一起使用的主要内容,如果未能解决你的问题,请参考以下文章
使用 Xcode 的单元测试框架,应用程序代码是不是可以确定它是不是作为单元测试运行?
应用程序是不是可以通过 TestFlight 检测它是不是安装为“外部测试”