在某些资源上,我看到了一个代码:
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
- 这将从类型T
中删除cv限定符,或将数组T
转换为指针T
或将T
转换为函数指针。但是之前的typename
是什么?我想这与依赖类型有关,即提供的类型T
是另一个模板的一部分,对吗?is_same<A, B>{}
- 这个{}
大括号在这做什么?为什么?typename enable_if<A>::type
- 正如我所知,如果A
为真,则type
字段存在,在这种情况下它是void
,因为只有一个参数传递给{ {1}},对吗?但是再次 - 之前的enable_if
是什么?typename
- 这是template <typename T, typename = typename A>
的内容?参数名称在哪里?!答案 0 :(得分:2)
std::decay<T>
的静态变量,例如)std::is_same
将操作符强制转换为bool,并通过{}创建该类型的对象,然后转换为bool(在编译时)。替代变体是std::is_same<...>::value
std::is_same
返回true,则std::enable_if
的成员类型存在且SFINAE可以通过该功能 P.S。 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)并且它没有 type 成员,但是如果它是 true 选择专业化(2)