如何在CRTP中为一个类似于派生类的名称添加别名?
是否(Derived1
)根本不可能,我必须完全创建一个新类(Derived2
)?
template<class CRTP,class T>class Base{};
//These don't work.
//template<class T> using Derive1 = Base<Derive1<T>,T>;
//template<class T> using Derive1 = Base<Base,T>;
//template<class T> using Derive1 = Base<Base<T>,T>;
//template<class T> using Derive1 = Base<Base<Base<T>>,T>;
//This works.
template<class T> class Derive2 : public Base<Derive2<T>,T>{};
int main(){
//Derive1<int> d1;
Derive2<int> d2;
}
有很多与typedef
和CRTP
相关的问题,但我找不到与我匹配的问题。
答案 0 :(得分:3)
这与CRTP无关。
using
创建别名;您尝试创建完全新和单独的类型。
不清楚为什么你会期望这样做,或者为什么所显示的解决方案还不够。
所以,是的,这是不可能的。
答案 1 :(得分:2)
尝试递归使用Base
的别名将无效,因为Base
的每次使用都需要您提供2个模板参数,但您永远不会这样做,因此排除了这些别名:
template<class T> using Derive1 = Base<Base,T>;
template<class T> using Derive1 = Base<Base<T>,T>;
template<class T> using Derive1 = Base<Base<Base<T>>,T>;
请注意,如果您接受别名的另一个模板参数,那么3 rd 会成功:
template<class T, class U> using Derive1 = Base<Base<T, U>,T>;
这让我们留下了这个:
template<class T> using Derive1 = Base<Derive1<T>,T>;
这个不起作用的原因是因为,在=
运算符的右侧,还没有名为Derive1
的类型,而在左侧,您使用与此类型相同的名称。那么你最终会遇到与之前相同的问题(递归引用),除非这是不可能的,因为不仅名称Derive1
的类型不存在,无法在模板参数中使用,但即使它执行了编译器会抱怨你试图重复使用相同的符号。
我怀疑你问的是X-Y Problem,所以如果你提供 的其他背景,你想使用这些别名,我可以为你提供另一种解决方案。