测试 std::p ointer_traits 是否可以与我的类型一起使用



如何在编译时检查任意类型是否可以与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不适应智能指针。

你不能。从 [pointer.traits.types]:

using element_type = see below ;

type:如果限定 id Ptr::element_type有效并表示类型 (14.8.2(,则Ptr::element_type;否则,T Ptr 是表单的类模板实例化 SomePointer<T, Args> ,其中 Args 是 零个或多个类型参数;否则,专业化是格式错误的。

为了对 SFINAE 友好,我们需要pointer_traits<Foo>简单地缺少一个名为 element_type 的类型别名。问题是,element_type被指定为格式不正确 - 而不是不存在。因此,您根本不能将pointer_traits用作检测器,以确定某些东西是否可以用作指针类型。

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

相关内容

  • 没有找到相关文章

最新更新