C++ 测试std::pointer\u特征是否可以与我的类型一起使用

C++ 测试std::pointer\u特征是否可以与我的类型一起使用,c++,pointers,smart-pointers,c++17,typetraits,C++,Pointers,Smart Pointers,C++17,Typetraits,如何在编译时检查任意类型是否可以与std::pointer\u traits一起使用?我曾希望一个简单的SFINAE解决方案能够奏效: template <typename T, typename = void> struct pointer_traits_ready : std::false_type {}; template <typename T> struct pointer_traits_ready< T, std::

如何在编译时检查任意类型是否可以与
std::pointer\u 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,"");
模板
结构指针\u准备就绪:std::false\u类型{};
模板
结构指针准备就绪<
T
std::void\u t
>:std::true_type{};
静态断言(!指针特性准备就绪::值“”);
…但这会从标准库(ptr_traits.h)中调用静态断言。显然,
std::is\u指针
不能容纳智能指针。

你不能。发件人:

类型:
Ptr::element_Type
如果限定id
Ptr::element_Type
有效并表示类型(14.8.2);否则,
T
如果
Ptr
是形式
SomePointer
的类模板实例化,其中Args是 零个或多个类型参数否则,专业化是不正确的。

为了对SFINAE友好,我们需要
pointer\u traits
来缺少名为
element\u type
的类型别名。问题是,
元素类型
被指定为格式不正确-不存在。因此,您不能简单地使用
pointer\u traits
作为是否可以将某个对象用作指针类型的检测器


即使您编写了自己的类型,它是该规范的SFINAE友好版本,您也无法捕获用户对自己类型的
pointer\u traits
的专门化。悲伤的熊猫

您可以尝试中描述的检测技术。用户专门化必须遵守标准的规则,在这种情况下,这些规则非常严格。否?@Yakk我想我可以使用element\u type=int;}编写
struct pointer\u traits{using element\u type=int;}只要我的
Foo
取消对它的引用?我想我可以编写一个
std::less
专门化,它不调用
operator@Barry真遗憾。谢谢你的回答。
using element_type = see below ;