函数重载和继承类型不会调用正确的重载

时间:2012-03-08 02:45:55

标签: c++ templates

给出以下基类:

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);

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

original question is located here

1 个答案:

答案 0 :(得分:3)

我不太喜欢你为了不同的原因而尝试做的事情(包括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对象的版本。