0

我有以下形式的问题:

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

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

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

我正在尝试做的事情是否有效,如果是,为什么它不起作用?
谢谢,
伊恩

4

3 回答 3

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>用作条件。)

于 2012-04-12T15:30:07.783 回答
1

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

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

这将f()使用类型参数进行调用,B*解析为您的第一个定义f(),即接受类型参数的定义A*f()否则,编译器将使用需要最少隐式类型转换的函数来解析调用。由于template <typename D> void f(D*);不需要类型转换,它将捕获所有f()不匹配更具体定义的调用。

于 2012-04-12T15:35:30.330 回答
0

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

最后,我通过在调用“f”之前将所有内容转换为“A*”类型来解决问题。

谢谢大家,

于 2012-04-21T05:22:15.077 回答