我想通过使用指向它的基类型的指针来调用专门的模板化函数。我不确定这是否可能,所以我愿意接受建议和/或替代方案。以下是我的情况示例:
class CBase {};
class CDerivedClass : public CBase {};
template<class T>
int func<T>(T &x) { ... };
template<>
int func<CDerivedClass>(CDerivedClass &x) { ... };
我有另一个管理CBase指针列表的函数,然后调用func()函数。
void doStuff()
{
CBase *foo[10] = { ...... };
for (int i = 0; i < 10; ++i)
func(*foo[i]);
}
有没有办法获取派生类型,以便调用func(CDerivedClass&amp;)?
答案 0 :(得分:1)
Template Subclassing怎么样?这个习惯用法允许你在C ++中使用编译时多态。它的成本是更高的冗长(例如指定整个类层次结构到当前类)。在你的情况下:
template <typename TSpec> class Klass {};
template <typename TSpec> struct SpecTag {};
template <typename TSpec> class Klass<SpecTag<TSpec> > {};
template <typename TSpec>
int func(Klass<TSpec> &x) { ... };
template <typename TSpec>
int func(Klass<SpecTag<TSpec> > &x) { ... };
答案 1 :(得分:0)
替代解决方案:从您的示例中可以明显看出,您应该在CBase
中使用虚拟方法,因此您只需在CBase
中定义虚拟函数并覆盖派生类中的函数。
答案 2 :(得分:0)
在这种情况下,“访客”模式得到了拯救。它可以在类外部实现的算法中实现多态行为。类中需要一些支持代码,但稍后可以添加新算法,修改现有算法等,而不会影响类。