考虑一下:
template <typename T>
struct A {
using MyType1 = ...;
using MyType2 = ...;
using MyType3 = ...;
using MyType4 = ...;
using MyType5 = ...;
...
};
template <typename T>
struct B: A<T> {
using MyType1 = typename A<T>::MyType1;
using MyType2 = typename A<T>::MyType2;
using MyType3 = typename A<T>::MyType3;
using MyType4 = typename A<T>::MyType4;
using MyType5 = typename A<T>::MyType5;
...
};
template <typename T>
struct C: A<T> {
using MyType1 = typename A<T>::MyType1;
using MyType2 = typename A<T>::MyType2;
using MyType3 = typename A<T>::MyType3;
using MyType4 = typename A<T>::MyType4;
using MyType5 = typename A<T>::MyType5;
...
};
... // Many more classes in the hierarchy
// with all the type declarations duplicated in each of them.
有什么方法可以缩短它?
有人询问了一个相关的question,但没有说明重复有多糟糕,也没有收到任何回复。
答案 0 :(得分:1)
如果您不想导入或重新声明派生类中的类型名,则至少需要告诉编译器在派生类层次结构中查找类型名。
您可以使用派生类的名称作为限定范围来执行此操作:
typename B::MyType1 x;
如果B
是长名称,或者您希望能够在B
和C
之间自由移动代码,则可以在类的开头添加typedef:
template <typename T>
struct B: A<T> {
using ThisType = B;
// ...
typename ThisType::MyType1 x;
};