函数重载和继承的类型没有调用正确的重载

Function overloads and inherited types are not calling the correct overload

本文关键字:重载 调用 类型 继承 函数      更新时间:2023-10-16

给定以下基类:

struct ValueType {
    String
    ToString(String const& format) const;
};

我希望对从ValueType:派生的类型调用此重载

String FormatValue(const ValueType& value, const String& format)
{
    return value.ToString(format);
}

否则,我希望调用此过载:

template <typename T>
String FormatValue(const T& value, const String& format);

如何确保派生类型不调用第二个重载?

原始问题位于此处。

由于不同的原因(包括ValueType接口,为什么不总是使用AnyToString?),我不太喜欢您尝试做的事情,但无论如何,您应该能够使用SFINAE 解决您的问题

template <typename T>
typename enable_if< !is_base_of<ValueType, T>::value, String>::type
FormatValue( T const & value, const String& format ) { ... }

该代码所做的(一旦编译:)是在满足条件时禁止模板函数。当编译器将模板视为重载时,它将尝试替换类型,如果满足条件,则enable_if实例化将无法具有嵌套的type,因此替换失败,模板将被丢弃。之后,最好的重载将是采用ValueType对象的版本。