我有以下形式的问题:
class A {
...
};
template <...> class B : public A {
...
}
f(A*) {...}
f(C*) {...}
template <...> f(D*) {...}
问题是,如果我使用 B* 类型的参数调用函数 f,它会选择泛型类型 D*(它根本与 A 或 B 无关)。我希望它选择 A* 的专业。
我正在尝试做的事情是否有效,如果是,为什么它不起作用?
谢谢,
伊恩
我有以下形式的问题:
class A {
...
};
template <...> class B : public A {
...
}
f(A*) {...}
f(C*) {...}
template <...> f(D*) {...}
问题是,如果我使用 B* 类型的参数调用函数 f,它会选择泛型类型 D*(它根本与 A 或 B 无关)。我希望它选择 A* 的专业。
我正在尝试做的事情是否有效,如果是,为什么它不起作用?
谢谢,
伊恩
您可以使用 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>
用作条件。)
我不确定您要做什么。你可以试试:
void f(B *b)
{
f(dynamic_cast<A*>(b));
}
这将f()
使用类型参数进行调用,B*
解析为您的第一个定义f()
,即接受类型参数的定义A*
。f()
否则,编译器将使用需要最少隐式类型转换的函数来解析调用。由于template <typename D> void f(D*);
不需要类型转换,它将捕获所有f()
不匹配更具体定义的调用。
看来我想做的事情并不是直接可能的;显然,模板专业化优先于多态性,如果没有 Boost 或 C++11,就不可能解决这个问题。
最后,我通过在调用“f”之前将所有内容转换为“A*”类型来解决问题。
谢谢大家,