通过基类专门化类模板
Specializing a class template by a base class
我已经把我的怀疑提炼到下面的代码中
struct base {};
struct derived : public base {};
template <class T>
struct Type { };
template <> struct Type<base> {
typedef float mytype;
};
typename Type<base>::mytype a=4.2; // this works
typename Type<derived>::mytype a=4.2; // this doesnt
有人能解释一下为什么我不能用derived
初始化类模板对象,并提出一个简单的方法吗?对于我感兴趣的实际问题,有很多派生类我想使用它们来初始化模板类对象和/或使用typedefs。他们中的人太多了,超出了我想单独研究的范围。
编辑:忘了提,我的坏,这需要C++03
#include <iostream>
#include <type_traits>
struct base { };
struct derived : base { };
template<typename T, bool = std::is_base_of<base, T>::value>
struct Type { };
template<typename T>
struct Type<T, true>
{
typedef float mytype;
};
int main()
{
Type<base>::mytype a1 = 4.2f;
Type<derived>::mytype a2 = 8.4f;
std::cout << a1 << 'n' << a2 << 'n';
}
在C++03中,std
可以简单地用boost
:boost::is_base_of
代替
具有不同模板参数的模板类的两个实例化是完全不相关的类类型。Type<derived>
与Type<base>
没有任何关系,这当然意味着它不使用专业化,而是从主模板实例化的。主模板没有嵌套类型mytype
。
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 公开最直接的基类模板名称
- 当基类是依赖类型时,这是一个缺陷吗
- 如何基于模板化类的基类专门化成员函数
- 在基类 = 未定义行为之后专门化type_trait?
- 通过基类专门化类模板
- 使用部分模板专门化来选择基类