[英]Template syntax explanation
在一些资源上,我看到了一个代码:
struct C
{
template <typename T, typename = typename enable_if<!is_same<C, typename decay<T>::type>{}>::type>
C(T&& f){}
}
我已尽力而为,但仍需要澄清。 我知道SFINAE
习语需要这件可怕的事情-如果某些失败,则将不会创建模板化函数。 这是我发现的:
typename decay<T>::type
type-从类型T
删除cv限定词,或将数组T
转换为指针T
或将T
转换为函数指针。 但是这个typename
以前是什么? 我想这与依赖类型有关,即提供的类型T
是另一个模板的一部分,对吗? is_same<A, B>{}
-这个{}
括号在这里做什么? 为什么? typename enable_if<A>::type
据我了解,如果A
为true,则type
字段存在,并且在这种情况下它是void
因为仅将一个参数传递给enable_if
,对吗? 但是再说一次-这个typename
以前是什么? template <typename T, typename = typename A>
-这是什么typename = typename A
? 参数名称到底在哪里? std::decay<T>
静态变量) std::is_same
已将运算符std::is_same
为bool,并通过{}创建了该类型的对象,然后将其转换为bool(在编译时)。 替代变体是std::is_same<...>::value
std::is_same
返回true,则存在std::enable_if
成员类型 ,并且SFINAE可以通过该函数 PS std::enable_if
看起来像这样
template<bool B, class T = void> //(1)
struct enable_if {};
template<class T> /(2)
struct enable_if<true, T> { typedef T type; };
因此,如果第一个参数为false,则选择主模板(1)并且它没有类型成员,但是如果它是true,则选择专业化(2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.