使用派生类调用父类的模板化函数重载

时间:2012-04-12 15:17:12

标签: c++ templates inheritance overloading

我遇到以下问题:

class A {
    ...
};
template <...> class B : public A {
    ...
}

f(A*) {...}
f(C*) {...}
template <...> f(D*) {...}

问题在于,如果我用类型B *的参数调用函数f,它会选择泛型类型D *(它根本不与A或B相关)。我希望选择A *的专业化。

我尝试做的有效,如果有,为什么它不起作用?
谢谢,
伊恩

3 个答案:

答案 0 :(得分:2)

您可以使用SFINAE:

template<typename T>
typename boost::disable_if<boost::is_base_of<A, T>, Ret>::type
f(T*);

(如果您要专门为B类型禁用此重载,而不仅仅是从A派生的所有类型,则可以使用boost::is_same<B, T>作为条件。)

答案 1 :(得分:1)

我不确定你要做什么。你可以试试:

void f(B *b)
{
  f(dynamic_cast<A*>(b));
}

这将调用带有f()类型参数的B*解析为f()的第一个定义,即接受类型A*的参数的定义。否则,编译器将解析对f()的调用,其中任何函数都需要最少隐式类型转换。由于template <typename D> void f(D*);不需要类型转换,因此它会捕获f()的所有调用,这些调用与更具体的定义不匹配。

答案 2 :(得分:0)

似乎我想做的事情不是直接可能的;显然模板特化优先于多态,如果没有Boost或C ++ 11,就不可能解决这个问题。

最后,我在调用“f”之前简单地通过将所有内容都输入“A *”来解决问题。

谢谢大家,