基于继承类模板更改基类成员的类型签名
Changing type signature of base class member based on inheriting class template
我有两个类,一个从另一个继承:
struct A {
(pure?) virtual tt returns_something();
}
template <typename T>
struct B : A {
virtual T returns_something();
}
我该如何使此工作,以便returns_something()
具有正确的类型签名。
我相信这是一个奇怪的重复模板模式的工作:
template <typename T>
struct A {
pure virtual typename T::tt returns_something();
}
template <typename TT>
struct B : A<B<TT>> {
typedef TT tt;
virtual tt returns_something();
}
然而,这似乎抱怨"在B<float>中没有名为‘tt’的类型"(当我用tt作为float实例化B
时)。
有什么想法吗?在这种情况下,这是正确的方法吗?还有其他更适合的方法吗?
注意:这是一个简化的情况。在B
模板化的同一类型上模板化A
只会使A
有很多模板参数,我不希望这样。
在实例化A<B<TT>>
时,B<TT>
仍然是一个不完整的类,因此不能使用B<TT>::tt
。
如果有问题的类型是B
的模板参数,那么您可以通过traits类提取模板参数:
template <typename TT>
struct B;
template<class> struct B_traits;
template<class TT>
struct B_traits<B<TT>> {
using tt = TT;
};
template <typename T>
struct A {
virtual typename B_traits<T>::tt returns_something();
};
演示。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如果基类包含双指针成员,则派生类的构造函数
- 继承和友元函数,从基类访问受保护的成员
- 如何基于模板化类的基类专门化成员函数
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 在派生类中使用基类的私有成员变量的最佳方法
- 为什么我需要在成员发起器列表中重复基类的模板参数?
- 继承:调用基类的成员和方法
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 当空基类也是成员变量时,为什么禁止空基优化?
- 引用基类模板的成员变量的简单方法
- 将基类的成员函数重载到其他派生类C++
- C++ 使用派生类方法更改基类数据成员
- 在成员构造函数之后调用基类构造函数
- 派生类看不到基类成员
- 使用派生类中的静态成员而不是基类
- 指向成员的 C++ 指针(指向成员基类的指针)
- 如何在c++中将模板成员函数的实参转发给成员基类指针