我知道如何在C ++中使用模板,但无法理解下面的代码,尤其是最后一行。它是半精度类型的运算符*重载。有人可以向我解释一下吗? (这里detail
是名称空间)
/// SFINAE helper for generic half-precision functions.
/// This class template has to be specialized for each valid combination of argument types to provide a corresponding
/// `type` member equivalent to \a T.
/// \tparam T type to return
template<typename T,typename,typename=void,typename=void> struct enable {};
template<typename T> struct enable<T,half,void,void> { typedef T type; };
template<typename T> struct enable<T,expr,void,void> { typedef T type; };
template<typename T> struct enable<T,half,half,void> { typedef T type; };
template<typename T> struct enable<T,half,expr,void> { typedef T type; };
template<typename T> struct enable<T,expr,half,void> { typedef T type; };
template<typename T> struct enable<T,expr,expr,void> { typedef T type; };
template<typename T> struct enable<T,half,half,half> { typedef T type; };
template<typename T> struct enable<T,half,half,expr> { typedef T type; };
template<typename T> struct enable<T,half,expr,half> { typedef T type; };
template<typename T> struct enable<T,half,expr,expr> { typedef T type; };
template<typename T> struct enable<T,expr,half,half> { typedef T type; };
template<typename T> struct enable<T,expr,half,expr> { typedef T type; };
template<typename T> struct enable<T,expr,expr,half> { typedef T type; };
template<typename T> struct enable<T,expr,expr,expr> { typedef T type; };
.... some codes ...
template<typename T> typename detail::enable<half&,T>::type operator*=(T rhs) { return *this *= static_cast<float>(rhs); }
我知道不同的模板对有不同类型的struct enable。但结构启用声明在上面做了什么?它是否在结构中定义了一个类型?(因此type
在sturct中有类型T?)并且在模板说明符中,例如是什么意思?我不知道这里的expr是什么。它是一种类型还是具有特殊含义?
答案 0 :(得分:1)
据我所知,对于此特定的 operator*=
只有前3行发挥了作用:
template<typename T,typename,typename=void,typename=void> struct enable {};
template<typename T> struct enable<T,half,void,void> { typedef T type; };
template<typename T> struct enable<T,expr,void,void> { typedef T type; };
此外,您可以更简单地重写它并获得相同的结果:
template<typename T,typename> struct enable {};
template<typename T> struct enable<T,half> { typedef T type; };
template<typename T> struct enable<T,expr> { typedef T type; };
运营商定义的含义不会改变:
template<typename T> typename detail::enable<half&,T>::type operator*=(T rhs) { return *this *= static_cast<float>(rhs); }
在编译时转换为这两个中的一个:
half& operator*=(half rhs) { return *this *= static_cast<float>(rhs); }
half& operator*=(expr rhs) { return *this *= static_cast<float>(rhs); }
人为限制您使用half
或expr
作为参数类型。
其他struct enable
模板专精在其他地方使用,但不适用于此特定运营商。