模板语法说明

Template syntax explanation

本文关键字:说明 语法      更新时间:2023-10-16

在一些资源上,我看到了一个代码:

struct C
{
    template <typename T, typename = typename enable_if<!is_same<C, typename decay<T>::type>{}>::type>
    C(T&& f){}
}

我尽力了,但还是需要澄清。我知道SFINAE习惯用法需要这个可怕的东西——如果某个东西失败了,模板化的函数就不会创建。这里我发现:

  1. typename decay<T>::type—这将从类型T中删除cv限定符,或将数组T转换为指针T,或将T转换为函数指针。但是这个typename以前是什么?我想这与依赖类型有关,即提供的类型T是另一个模板的一部分,对吧
  2. is_same<A, B>{}-这个{}牙套在这里做什么?为什么
  3. typename enable_if<A>::type-正如我所理解的,如果A为真,则存在type字段,在这种情况下,它是void,因为只有一个参数传递给enable_if,对吧?但再说一遍,这个typename以前是什么
  4. template <typename T, typename = typename A>-这个typename = typename A是什么?参数名称到底在哪里
  1. 是的,在这种情况下,typename关键字对编译器说decay::type实际上是类型(但不是std::decay<T>的静态变量)
  2. std::is_same将运算符强制转换为bool,并通过{}创建该类型的对象,然后将其转换为bool(在编译时)。可供选择的变体是std::is_same<...>::value
  3. 如果std::is_same返回true,则std::enable_if的成员类型存在,并且SFINAE可以通过该函数
  4. 该上下文中不需要参数名称(因为某个地方没有使用它)

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),并且它没有类型成员,但如果是true特化(2),则选择