带有继承的c++模板专门化
C++ Template Specialization with Inheritance
以下情况:
class FeatureBase
class Feature1 : public FeatureBase
class FeatureAttrBase
class Feature1Attr : public FeatureAttrbase
FeatureBase包含一个FeatureAttrBase的列表,应该能够创建和管理这些对象。因此,我在FeatureBase上使用了一个模板。
template<class T = FeatureAttrBase> class FeatureBase
创建和管理属性(例如new T())
和子类使用专门化继承
class Feature1 : public FeatureBase<Feature1Attr>
在我代码的其他地方,我写了一个方法
RegisterFeature(FeatureBase<FeatureAttrBase>* feature)
但是编译器给了我一个错误,它无法在Feature1和FeatureBase之间转换。在上述方法中,我只需要使用来自FeatureAttrBase的信息。但是在Feature1中,我需要访问Feature1Attr。
所以问题是如何解决这个问题?我必须更改我的数据结构吗?
模板参数相互继承不会使模板类相互关联。相反,你应该这样做(可能不是最好的解决方案,但你没有指定你要做什么):
class FeatureAttrBase;
class FeatureBase
{
public:
virtual FeatureAttrBase* GetAttributes() = 0;
};
template<class T>
class FeatureImpl : public FeatureBase
{
T attr;
public:
FeatureAttrBase* GetAttributes()
{
return &attr;
}
};
class Feature1Attr : public FeatureAttrBase;
class Feature1 : public FeatureImpl<Feature1Attr>;
实际上,您可能不需要FeatureImpl
类,而可以将实现直接放在Feature1
类中(并完全摆脱模板)。
可以从FeatureBase<FeatureAttrBase>
继承FeatureBase
的专门化。像这样:
// Forward declaration
template <typename T>
class FeatureBase;
// Type selecting trait class FeatureBase_BaseClass
// FeatureBase for derived Attrs will inherit from FeatureBase<FeatureAttrBase>
template <typename T>
struct FeatureBase_BaseClass
{
typedef FeatureBase<FeatureAttrBase> Type;
};
// FeatureBase<FeatureAttrBase> will inherit from a dummy type
template <>
struct FeatureBase_BaseClass<FeatureAttrBase>
{
struct Type {};
};
// Use FeatureBase_BaseClass to select the proper base class for FeatureBase
template <typename T = FeatureAttrBase>
class FeatureBase : public FeatureBase_BaseClass<T>::Type
{
//as before
};
这样,所有FeatureBase<X>
的特定属性X
将从FeatureBase<FeatureAttrBase>
继承。
相关文章:
- 是否可以对零模板参数进行模板专门化
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 如何为指向复杂值的迭代器专门化算法?
- 专门化模板覆盖函数/避免对象切片
- 我能否根据其运算符()的签名专门化可变参数模板参数
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 输入两个不专门化大小的矩阵
- 如何在模板类中专门化赋值运算符?
- 如何专门化容器和枚举的模板
- Clang拒绝类模板的嵌套类仅通过专门化定义的代码是正确的吗
- 取消专门化C++模板参数
- SFINAE的变分变量模板专门化
- 如何在编译时专门化大型模板函数中的小部分
- 如何在c++运算符()中专门化调用模板
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 如何专门化字符串数组的模板?
- 如何专门化模板
- 如何避免为模板化迭代器的每个可能的实例化专门化iterator_traits?