模板语法说明

时间:2015-12-22 09:17:33

标签: c++ templates syntax

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

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,因为只有一个参数传递给{ {1}},对吗?但是再次 - 之前的enable_if是什么?
  4. typename - 这是template <typename T, typename = typename A>的内容?参数名称在哪里?!

1 个答案:

答案 0 :(得分:2)

  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. 在该上下文中不需要参数名称(因为它不在某处使用)
  5. 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)