具有多态性的模板专业化

发布于 2024-12-07 09:43:14 字数 532 浏览 0 评论 0原文

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

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

I'm wanting to invoke a specialized templated function by using a pointer to it's base type. I'm not sure if this possible so I'm open to suggestions and/or alternatives. Here is an example of my situation:

class CBase {};
class CDerivedClass : public CBase {};

template<class T>
int func<T>(T &x) { ... };

template<>
int func<CDerivedClass>(CDerivedClass &x) { ... };

I have another function that manages a list of CBase pointers and then calls the func() function.

void doStuff()
{
    CBase *foo[10] = { ...... };

    for (int i = 0; i < 10; ++i)
        func(*foo[i]);
}

Is there a way to get the derived type, so that func(CDerivedClass &) is called?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

掩耳倾听 2024-12-14 09:43:14

模板子类化怎么样?这个习惯用法允许您在 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) { ... };

What about Template Subclassing? This idiom allows you to use compile-time polymorphism in C++. The cost of it is higher verbosity (such as specifying the whole class hierarchy up to the current class). In your case:

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) { ... };
甜点 2024-12-14 09:43:14

在这种情况下,“访客”模式可以发挥作用。它允许在类外部实现的算法中实现多态行为。类内部需要一些支持代码,但以后可以添加新算法、修改现有算法等,而不会影响类。

The "Visitor" pattern comes to the rescue in this case. It enables polymorphic behavior in an algorithm implemented outside the class. Some support code is required inside the class, but new algorithms can later be added, existing algorithms modified, etc., without affecting the class.

慕巷 2024-12-14 09:43:14

替代解决方案:从您的示例中,很明显您应该在 CBase 中使用虚拟方法,因此您只需在 CBase 中定义一个虚拟函数和一个重写函数在派生类中。

Alternative solution : from your example, it's obvious that you just should to use a virtual method in CBase, so you just have to define a virtual function in CBase and an overriding function in the derived class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文