具有多态性的模板专业化

时间:2011-10-02 16:25:46

标签: c++ templates polymorphism specialization

我想通过使用指向它的基类型的指针来调用专门的模板化函数。我不确定这是否可能,所以我愿意接受建议和/或替代方案。以下是我的情况示例:

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;)?

3 个答案:

答案 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)

在这种情况下,“访客”模式得到了拯救。它可以在类外部实现的算法中实现多态行为。类中需要一些支持代码,但稍后可以添加新算法,修改现有算法等,而不会影响类。