C++ 模板语法解释

C++ 模板语法解释,c++,templates,syntax,C++,Templates,Syntax,在某些资源上,我看到一个代码: struct C { template <typename T, typename = typename enable_if<!is_same<C, typename decay<T>::type>{}>::type> C(T&& f){} } struct C { 模板{}>::类型> C(T&&f){} } 我尽了最大努力,但仍然需要一些澄清。我知道SFINAE习惯用法需要这个

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

struct C
{
    template <typename T, typename = typename enable_if<!is_same<C, typename decay<T>::type>{}>::type>
    C(T&& f){}
}
struct C
{
模板{}>::类型>
C(T&&f){}
}
我尽了最大努力,但仍然需要一些澄清。我知道
SFINAE
习惯用法需要这个可怕的东西——如果有什么东西失败了,模板函数就不会被创建。以下是我的发现:

  • typename decay::type
    -这将从type
    T
    中删除cv限定符,或将数组
    T
    转换为指针
    T
    ,或将
    T
    转换为函数指针。但是这个
    typename
    以前是什么?我想这与依赖类型有关,即提供的类型
    T
    是另一个模板的一部分,对吗
  • 是否相同{}
    -大括号在这里做什么?为什么?
  • typename enable\u if::type
    -据我所知,如果
    A
    为true,则
    type
    字段存在,在本例中为
    void
    ,因为只有一个参数被传递到
    enable\u if
    ,对吗?但是再说一遍,这个
    typename
    以前是什么
  • 模板
    -这是什么?争论的名字到底在哪里
  • 是的,typename关键字在这种情况下对编译器说decay::type是真正的类型(例如,不是
    std::decay
    的静态变量)
  • std::is_same
    将运算符强制转换为bool,并通过{}创建该类型的对象,然后(在编译时)将其转换为bool。替代变量是
    std::is_same::value
  • 如果
    std::is_same
    返回true,则
    std::enable_的成员类型If
    存在并且SFINAE可以通过该函数
  • 在该上下文中不需要参数名(因为它没有在某个地方使用)
  • 注意:如果看起来像这样,请启用

    template<bool B, class T = void>  //(1)
    struct enable_if {};
    
    template<class T>  /(2)
    struct enable_if<true, T> { typedef T type; };
    
    模板//(1)
    如果{},结构启用_;
    模板/(2)
    如果{typedef T type;},则结构启用_;
    
    因此,如果第一个参数为false,则选择主模板(1),并且它没有类型成员,但如果为true,则选择专门化(2)