【发布时间】:2017-05-22 10:38:51
【问题描述】:
如何为 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 相关的问题,但我找不到与我匹配的问题。
【问题讨论】:
-
typedef 不会创建新类型。它仅对类型进行别名。请解释为什么您希望其中任何一个 using 语句起作用
-
在 CRTP 中你派生一个类...你的“derive1”尝试不使用任何派生,我不清楚你在问什么
-
@AndyG 同意它并没有真正创建一个新类。我希望这些语句能够工作,因为在许多非常简单的情况下,别名和(非常简单的)继承非常可交换并产生相同的结果。不过,我是 C++ 新手。
-
继承和不继承是完全不同的
-
优化后你的程序什么都不做……这与任何事情都没有关系