language reference of std::enable_if at cppreference中包含以下注释



在下面示例中的模板函数中,在我看来这种情况发生了。即,两个模板函数onlyForDerivedObjects(...)(对我而言)似乎仅在默认模板参数方面有所不同。我意识到我在这里遗漏了一些东西,希望有人可以向我解释一下,或者指向我可能会为自己找到顿悟的方向。

  • 问题: W.r.t.上面的引用,为什么下面的示例可以编译并运行良好:当我认为下面的模板函数中的typename std::enable_if ...部分导致两个模板函数的默认模板参数不同时,是否对g++ -Wall -std=c++11 ...部分进行了错误分类?


  • Live demo

  • 基类和派生类:
    class BaseA
    {
    public:
      int getInt() const { return 21; };
    };
    
    class DerivedA : public BaseA {};
    
    class BaseB
    {
    public:
      int getAnotherInt() const { return 33; };
    };
    
    class DerivedB : public BaseB {};
    

    具有以下模板功能
    /* template functions that, seemingly, only differ in their
       default template arguments? */
    template< class T,
              typename std::enable_if<std::is_base_of<BaseA, T>::value>::type* = nullptr >
    int onlyForDerivedObjects(const T& obj)
    {
      return 2*obj.getInt();
    }
    
    template< class T,
              typename std::enable_if<std::is_base_of<BaseB, T>::value>::type* = nullptr >
    int onlyForDerivedObjects(const T& obj)
    {
      return 3*obj.getAnotherInt();
    }
    

    编译并正常运行(g++ 4.9.3,ojit_code)
    #include <iostream>
    #include <type_traits>
    
    /* ... classes and template functions as above */
    
    /* template argument deduction seems to work fine */
    int main()
    {
      DerivedA* objA = new DerivedA();
      DerivedB* objB = new DerivedB();
    
      std::cout << onlyForDerivedObjects(*objA) << std::endl; // 42
      std::cout << onlyForDerivedObjects(*objB) << std::endl; // 99
    
      return 0;
    }
    

    最佳答案



    您的函数不仅在默认模板参数上不同,而且在模板参数上也不同,因此具有不同的签名。

    在这两种情况下,默认模板参数nullptr,但是第二个模板参数在每种情况下都不同。

    关于c++ - 使用std::enable_if作为模板时的默认模板参数。参数:为什么可以使用两个模板函数,它们仅在enable_if参数上有所不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38305222/

    10-11 22:07
    查看更多