STL模板部分特例化。

template<bool _Test,
    class _Ty = void>
    struct enable_if
    {    // type is undefined for assumed !_Test
    };

template<class _Ty>
    struct enable_if<true, _Ty>
    {    // type is _Ty for _Test
    typedef _Ty type;
    };

代码如上,enable_if<true, _Ty>,这里应该是一个类模板的特例化吧,可是为啥是true,不应该是一个类型吗?这是什么用法?

阅读 4.1k
2 个回答

C++的模板一般是用于泛型(也就是一份代码给多种类型共用),但是也可以用于非类型(Non-type template parameter),可以是整型、字符、布尔这些可以通过字面量明确判定等价的类型

你平时声明一个类型模板参数可能是 template <typename T>,而这里Non-type模板参数是 template <bool B>,就这点区别而已。如果要详细说enable_if这个模板技法,关键不是在Non-type,也不是在partial spec,而是在于SFINAE,你学习一下这方面的内容。

enable_if上面写着template<bool _test>,所以自然要填true/false进去。

在使用的时候,你会发现如果一个表达式expr的结果为true,那么enable_if<expr>::type就是存在的。所以你就可以写这样的代码:

template<typename T>
__forceinline T Copy(typename enable_if<sizeof(T)>=4, T>::type const& t)
{
    return t;
}

来测试一个类型是否不小于4个字节。如果是原样返回,如果不是就编译错误。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题