函数重载和继承的类型没有调用正确的重载
Function overloads and inherited types are not calling the correct overload
给定以下基类:
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
对象的版本。
相关文章:
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 重载方法的方式会在使用临时调用时生成编译器错误
- 重载类方法的不明确调用
- C++ 如何重载 [] 运算符并进行函数调用
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 调用重载的"<大括号括起来的初始值设定项列表>"对于对来说就足够了是模棱两可的
- 为什么初始化时没有调用重载赋值运算符?
- 如何调用用于重载运算符"<<"的 friend 函数?
- 模板化类如何解析在其类型之一上调用的重载非成员函数?
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- C++:对函子重载调用运算符的未定义引用
- 重载调用是不明确的:一对内联映射作为构造函数参数
- C++模板重载调用
- 使用子类型重载调用函数
- 从新重载调用构造函数和直接调用构造函数有什么区别?
- 使用已删除的副本构造函数和初始值设定项列表重载调用类定义中的成员构造函数
- 如何重载调用自身重载版本的函数
- 重载调用是二义性的
- C++运算符重载:调用默认函数