给出以下基类:
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);
如何确保派生类型不会调用第二个重载?
答案 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
对象的版本。