对于c++元编程库中类型判定, 例如std::is_void,内部实现都是使用模板。
所以需要了解模板的使用方法,及模板的特化,偏特化,全特化,模板的推导等相关知识。
话不多说,直接上代码。(此代码也只是实现方式之一,了解其精髓,其它亦可解。)
这种实现是没有去除is_void<type>中的type附带的顶层cv属性的。实现模板的推导来实现具体调用哪个版本的模板特化。
template<typename T> // 主模板
struct is_void : std::false_type {};
template<> // 对 T = void 的显式特化
struct is_void<void> : std::true_type {};
template <class _Ty, _Ty _Val>
struct integral_constant {
static constexpr _Ty value = _Val;
using value_type = _Ty;
using type = integral_constant;
constexpr operator value_type() co