std::void_t_C++中文网
| template< class... > |
(C++17 起) | |
将任意类型的序列映射到类型 void 的工具元函数。
注意
模板元编程中,用此元函数检测 SFINAE 语境中的病式类型:
// 初等模板处理无嵌套 ::type 成员的类型: template< class, class = std::void_t<> > struct has_type_member : std::false_type { }; // 特化识别拥有嵌套 ::type 成员的类型: template< class T > struct has_type_member<T, std::void_t<typename T::type>> : std::true_type { };
它亦可用于检测表达式的合法性:
// 初等模板处理不支持前置自增的类型: template< class, class = std::void_t<> > struct has_pre_increment_member : std::false_type { }; // 特化识别支持前置自增的类型: template< class T > struct has_pre_increment_member<T, std::void_t<decltype( ++std::declval<T&>() )> > : std::true_type { };
直至 CWG1558 ( C++14 缺陷)前,别名模板中未使用的参数不保证 SFINAE 且可被忽略,故早期编译器要求 void_t 的更复杂定义,例如:
template<typename... Ts> struct make_void { typedef void type;}; template<typename... Ts> using void_t = typename make_void<Ts...>::type;
示例
输出:
true true false false true
参阅
| 根据编译期布尔常量隐藏一个函数重载或模板特化 (类模板) |