首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板与继承

问模板与继承
EN

Stack Overflow用户
提问于 2013-11-08 13:57:01
回答 2查看 99关注 0票数 1

如果我有一个基类及其层次结构:

代码语言:javascript
复制
class BaseClass {
}

class DerivedClass : public BaseClass {
}

还有一个模版类:

代码语言:javascript
复制
template <class T> struct TemplatedClass {
}

我怎样才能做到这一点?

代码语言:javascript
复制
// 1:
void doSomething(TemplatedClass<BaseClass *> const &t);

// 2:
std::vector<TemplatedClass<BaseClass *>> v;

TemplatedClass<DerivedClass *> a;

// Doesn't compile
doSomething(a);

// Doesn't compile
v.push_back(a);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-08 14:08:53

您需要将TemplatedClass<DerivedClass*>转换为TemplatedClass<BaseClass *>,因为它们是独立的类型。最好的方法是构造函数,如下所示:

代码语言:javascript
复制
template <class T> struct TemplatedClass {
    template<class P> TemplatedClass( const TemplatedClass<P> &an );
};

看起来您正在尝试制作类似智能指针的东西,您应该看看它是如何在std::shared_ptr或boost::shared_ptr上完成的。如果计划在生产中使用此代码并/或与您的团队共享该代码,则可能需要对传递给此ctor的数据类型进行额外的检查:

代码语言:javascript
复制
template <class T> struct TemplatedClass {
    template<class P, class = typename std::enable_if<std::is_convertible<P, T>{}>::type>
    TemplatedClass( const TemplatedClass<P> &an );
};

同样,最好的方法是查看shared_ptr的来源,并查看它是如何在那里完成的。

票数 1
EN

Stack Overflow用户

发布于 2013-11-08 14:18:18

您也可以让模板化的类具有层次结构。但是,您需要指定基本内容:

代码语言:javascript
复制
template <typename...>
struct TC;

template <>
struct TC<> {
    virtual ~TC() {}
};
template <typename T, typename... B>
struct TC
    : TC<B...> {
    // ...
};

使用继承的变量参数,这应该允许您指定模板之间的关系,以模拟底层的继承层次结构。例如:

代码语言:javascript
复制
TC<Base>* d = new TC<Derived, Base>(/*...*/);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19860767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档