关于模板化类型和类层次结构的 C++ 函数重载解析

标签 c++ templates resolution class-hierarchy overloading

<分区>

Possible Duplicate:
Priority when choosing overloaded template functions in C++

模板化函数让我可以方便地对各种类型进行操作:

template<typename T> void destroy(T* obj) {
    delete obj;
}

但在某些时候我想对类层次结构进行一些专门化:

class Base { virtual void doSomething(); };
class Derived : public Base {};
void destroy(Base* obj) {
    obj->doSomething();
    delete obj;
}

如果我传递了确切的类型Base*,预期的专用函数确实被调用,但是重载决策的规则似乎更喜欢通用模板化版本,而不是在我传递时执行静态向上转换Derived*void detroy()

当然,我可以为所有可能的派生类型创建所有重载函数,但它的可维护性较差。

我正在使用 Visual C++ 2008,有什么办法可以解决上述问题吗?

最佳答案

在所有条件相同的情况下,重载解析更喜欢非模板函数而不是函数模板。然而,在这种情况下,并不是所有的事情都是平等的。为了匹配您对 Base* 的重载,需要进行派生到基指针的转换;无需转换即可匹配函数模板。因此,为 Derived* 选择函数模板。

虽然可能容易出错,但“简单”的解决方案是在调用函数之前将 Derived* 转换为 Base*

至少在理论上,您可以像 Ben 所建议的那样采用 SFINAE 方法,但是您必须为您提供专门化的任何类型显式禁用泛型函数模板,否则最终会出现重载歧义。这比显式转换方法更难维护和更容易出错。 (不过,这里有人可能知道另一种解决过载歧义的方法;如果有的话,我当然很想知道)。

关于关于模板化类型和类层次结构的 C++ 函数重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2395321/

相关文章:

C++ 预处理器宏和返回语句

C++ 标准库串行端口 (UART) 接口(interface)

c++ - 如果我将它绑定(bind)到 "this", std::bind 是否保留对象的引用/拷贝?

c++ - 拆分参数包

c++ - <Inside The C++ Object Model> 中的模板解析

javascript - 如何使用 HTML5 或 Javascript 查找上传图像的分辨率?

c++ - int* 和 int*[] 有什么区别

c++ - 类模板参数推导和默认模板参数

c++ - 参数化 typedef 可能吗?

css - 为不同的分辨率扩展容器 div 中的 div