C++ 启用_if作为模板参数

C++ 启用_if作为模板参数,c++,c++11,templates,enable-if,C++,C++11,Templates,Enable If,请告诉我为什么有效 如果在那之后我们可以忽略它,那么enable_发生了什么?(进一步使用Foo struct不需要在模板参数中启用_) 该代码不应该是这样的: 原始版本: template <typename Policy, typename = typename std::enable_if<std::is_base_of<BasePolicy, Policy>::value>::type > struct Foo; template

请告诉我为什么有效

  • 如果在那之后我们可以忽略它,那么enable_发生了什么?(进一步使用Foo struct不需要在模板参数中启用_)
  • 该代码不应该是这样的:
  • 原始版本:

    template <typename Policy,
              typename = typename std::enable_if<std::is_base_of<BasePolicy, Policy>::value>::type >
    struct Foo;
    
    template <typename Policy>
    struct Foo {
        Foo();
    };
    
    template <typename Policy>
    Foo<Policy>::Foo() {
    }
    
    模板
    结构Foo;
    模板
    结构Foo{
    Foo();
    };
    模板
    Foo::Foo(){
    }
    
    编辑版本:

    template <typename Policy,
              typename = typename std::enable_if<std::is_base_of<BasePolicy, Policy>::value>::type >
    struct Foo;
    
    template <typename Policy>
    struct Foo<Policy> {  // <Policy> added!
        Foo();
    };
    
    template <typename Policy>
    Foo<Policy>::Foo() {
    }
    
    模板
    结构Foo;
    模板
    结构Foo{//已添加!
    Foo();
    };
    模板
    Foo::Foo(){
    }
    
    发生这种情况:

  • 作者发布了工作代码(
    在场)

  • 评论中有一些讨论导致作者编辑代码,他犯了一个错误(
    被删除)

  • 我纠正了错误,将丢失的
    放回原处


  • 有人能解释为什么即使是编辑过的版本也能工作吗

    当您尝试实例化
    Foo
    时,编译器会考虑带有默认模板参数的声明。计算默认参数,如果
    std::is_base_of::value
    false
    ,则
    enable_如果
    产生SFINAE友好错误

    如果
    std::is\u base\u of::value
    true
    ,则选择部分专门化

    template <typename Policy>
    struct Foo<Policy> {
        Foo() { } 
    };
    
    // is equivalent to
    
    template <typename Policy>
    struct Foo<Policy, void> {
        Foo() { } 
    };
    
    模板
    结构Foo{
    Foo(){}
    };
    //相当于
    模板
    结构Foo{
    Foo(){}
    };
    

    上述专门化是等效的,因为默认情况下,
    typename std::enable_if::type
    void

    “如果这样,那么enable_会发生什么情况?如果之后我们可以省略它?”-在什么之后。。。请你把你的问题说得更清楚一点好吗?如果你还包括原始代码,以使差异更容易理解,那就太好了。我说得很清楚,并添加了原始代码谁说原始代码必须工作?这是作者犯的一个错误。它首先有
    ,但作者在新版中删除了它。检查编辑历史记录和评论。感谢您的关注。你能解释一下为什么正确的版本有效吗?我的意思是C++的哪个特性使这个魔术发生?“莫尔:添加了一个解释:你是一个<代码>策略>代码> @ SombreroChicken:你只是一个<代码> BasePolicy <代码>。