如何为静态成员编写std::is_member_{object,function}_pointer

How to write std::is_member_{object,function}_pointer for static members?

本文关键字:member object pointer function is 静态成员 std      更新时间:2023-10-16

<type_traits>标准头文件定义了元函数

template< class T >
struct is_member_object_pointer;
template< class T >
struct is_member_function_pointer;
template< class T >
struct is_member_pointer;
如果可能的话,如何为静态成员变量和函数编写一组类似的元函数?为什么这些元函数不是<type_traits>(或boost的等价物)的一部分?

自c++ 17以来,它们是<type_traits>的一部分,名称为std::void_t。用它可以检查特定的类类型是否有成员变量和/或函数。

例如,要检查类类型Type是否有成员对象x,您可以使用如下命令:
template<class, class = std::void_t<>>
struct has_x : std::false_type {};
template<class T>
struct has_x<T, std::void_t<decltype( std::declval<T&>().x )>> : std::true_type {};

,类似地,对于成员函数x(),您将使用:

template<class, class = std::void_t<>>
struct has_x_mem_fn : std::false_type {};
template<class T>
struct has_x_mem_fn<T, std::void_t<decltype( std::declval<T&>().x() )>> : std::true_type {};
相关文章: