C++ 17 提供了 void_t
, 它是一个模板别名, 定义为
template<class...>
using void_t = void;
void_t
一般用于元编程. 从定义上看, void_t
的定义平淡无奇, 但利用 SFINAE 原则在元编程中却可以发挥巨大威力.
使用 void_t
例 1: 判断某类型是否有指定内嵌类型的模板定义
// primary template handles types that have no nested ::type member:
template< class, class = std::void_t<> >
struct has_type_member : std::false_type {