从 std::enable_if 谈type traits


#1

c++通过模板的偏特化实现了 type traits, 是通过模板偏特化处理的。 通过std::enable_if的源码可以看到, std::enable_if 实现(从VS2015中剥离)了以下的两个类:

template<class Type> struct enable_if<false, Type> {};
template<class Type> struct enable_if<true, Type>  {typedef Type type;}; 

从上述可以看到, std::enable_if 通过偏特化第一个bool参数, 当传入的值为 true, 模板 template struct enable_if<true, Type> 就会被编译器选中, 生成对应的C++。 这样子就产生了一个 enable_if<true, Type>::type 的类型!这个type就是我们传入的类型!

模板的偏特化甚至可以替代通过虚函数实现多态, 而这种多态是在 c++ 编译其实现的。

这里顺便说一下 std::enable_if 的使用, 假如我们在使用 magic_get 这个类,由于他的反射只能在 POD 类型中使用, 因此我们可以通过一下代码保证我们的类是 POD (由编译器实现!能让机器做的事情何必要用人来做呢?)

实现以下模板(当然, 这里其实更好的方式是通过 static_assert 实现判断!)

template<class pod_type> struct type_tratis_pod
{
    typedef typename std::enable_if<std::is_pod<pod_type>::value, pod_type>::type pod_type;
}; 

struct not_pod_type{
    not_pod_type() {}
    ~not_pod_type() {}
    int t;
}; 

int main()
{
    type_tratis_pod<int>::pod_type t1;  // OK
    type_tratis_pod< not_pod_type >::pod_type t2;  // ERROR
    return 0;
}

#2

你这不还是用的 is_pod 吗?