代码之家  ›  专栏  ›  技术社区  ›  Patrick Parker

不明确的重载函数仅因参数的模板参数而异

  •  0
  • Patrick Parker  · 技术社区  · 5 年前

    请考虑以下代码:

    SmartPointer<Data> Fix(SmartPointer<Data> data)
    {
        return { /* Fixed Data */ };
    }
    SmartPointer<Data> Fix(SmartPointer<DataWrapper> dataWrapper)
    {
        return Fix(dataWrapper->Data());    
    }
    

    注意:例如,我希望能够传入一个子类 SmartPointer<SubclassOfDataWrapper> 同时,将这个解析为超类的重载函数。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Guillaume Racicot    5 年前

    检查智能指针类中是否有模板转换运算符。

    转换运算符中的静态断言不会告诉编译器这些重载不是不明确的。

        2
  •  0
  •   Patrick Parker    5 年前

    感谢提供的提示 Guillaume Racicot

    template<typename T>
    SmartPointer<Data> Fix(SmartPointer<T> dataWrapper)
    {
        // Note: only a subclass of DataWrapper would have the method ->Data()
        //            a subclass of Data would not have it (SFINAE principle)
        return Fix( dataWrapper->Data() );
    }
    template<>
    SmartPointer<Data> Fix(SmartPointer<Data> data)
    {
        return { /* Fixed Data */ };
    }