关于模板化类型和类层次结构的c ++函数重载决策

Ric*_*ung 4 c++ templates overloading resolution class-hierarchy

可能重复:
在C++中选择重载模板函数时的优先级

模板化功能使我可以方便地操作各种类型:

template<typename T> void destroy(T* obj) {
    delete obj;
}
Run Code Online (Sandbox Code Playgroud)

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

class Base { virtual void doSomething(); };
class Derived : public Base {};
void destroy(Base* obj) {
    obj->doSomething();
    delete obj;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jam*_*lis 5

在所有条件相同的情况下,重载解析更喜欢非模板函数来运行模板.但是,在这种情况下,所有事情都不相同.为了匹配你的重载Base*,必须进行派生到基指针的转换; 不需要转换来匹配功能模板.因此,选择功能模板Derived*.

"简单"(虽然可能容易出错)解决方案是在调用函数之前将其转换Derived*为a Base*.

至少在理论上你可以像Ben建议的那样采用SFINAE方法,但你必须明确禁用你提供特化的任何类型的泛型函数模板,否则你最终会遇到过载模糊.与显式强制转换方法相比,这更难以维护且容易出错.(虽然,这里有人可能知道另一种解决过载模糊的方法;我当然有兴趣知道是否存在).