在CRTP中创建(伪)派生类的Typedef - 不可能吗?

时间:2017-05-22 10:38:51

标签: c++ c++14 typedef crtp

如何在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;
}

Demo

有很多与typedefCRTP相关的问题,但我找不到与我匹配的问题。

2 个答案:

答案 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,所以如果你提供 的其他背景,你想使用这些别名,我可以为你提供另一种解决方案。