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
如果限定idPtr::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 ;