测试std :: pointer_traits是否可以使用我的类型

时间:2017-04-05 23:15:50

标签: c++ pointers smart-pointers c++17 typetraits

如何在编译时检查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不适合智能指针。

1 个答案:

答案 0 :(得分:2)

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

using element_type = see below ;
     

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

为了对SFINAE友好,我们需要pointer_traits<Foo>只缺少名为element_type的类型别名。问题是,element_type被指定为格式错误 - 并非缺席。因此,您无法使用pointer_traits作为检测器来判断是否可以将某些内容用作指针类型。

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