我遇到以下问题:
class A {
...
};
template <...> class B : public A {
...
}
f(A*) {...}
f(C*) {...}
template <...> f(D*) {...}
问题在于,如果我用类型B *的参数调用函数f,它会选择泛型类型D *(它根本不与A或B相关)。我希望选择A *的专业化。
我尝试做的有效,如果有,为什么它不起作用?
谢谢,
伊恩
答案 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 *”来解决问题。
谢谢大家,