C++ CRTP中间类,也需要最终确定
我有一个CRTP类的继承链。CRTP类彼此派生,直到“final”派生类将自身作为CRTP参数传递并完成继承链C++ CRTP中间类,也需要最终确定,c++,templates,crtp,C++,Templates,Crtp,我有一个CRTP类的继承链。CRTP类彼此派生,直到“final”派生类将自身作为CRTP参数传递并完成继承链 template <class W> struct Base { ..... }; template <class W> struct Derived_inheritable: public Base<W> { .... } template <class W> struct Derived2_inheritable: publ
template <class W>
struct Base
{
.....
};
template <class W>
struct Derived_inheritable: public Base<W>
{
....
}
template <class W>
struct Derived2_inheritable: public Derived_inheritable<W>
{
....
}
...
模板
结构基
{
.....
};
模板
结构派生\u可继承:公共基
{
....
}
模板
结构派生2_可继承:公共派生的_可继承
{
....
}
...
我想做的是能够在CRTP继承链的每个级别上都有这样的“最终”最终用户类,它们不涉及模板:
typedef Derived1_inheritable<Derived1> Derived1;
typedef-Derived1_可继承的Derived1;
正如您所猜测的,这个typedef不起作用,因为它引用了自己定义的类型。问题是如何做到这一点?
我能想到的是:
struct Derived1: public Derived1_inheritable<Derived1>
{
//not convenient, need to redefine at least a forwarding constructor
}
struct-Derived1:public-Derived1\u可继承
{
//不方便,需要重新定义至少一个转发构造函数
}
正如代码中的注释所说,这不是一个非常优雅的解决方案-我需要重新定义构造函数以转发到基本构造函数。有人知道更优雅的方式吗?
typedef-Derived1_可继承的Derived1
这一行毫无意义,模板的参数是一个类型,但您正在尝试传递一个模板(顺便说一句,您正在实例化的模板是同一个模板,但除此之外,还有一个额外的怪癖,即您的模板将一个类型作为参数,而您正在传递一个非类型)
从这个问题上看,你想达到什么目的并不十分清楚。你应该努力陈述你的目标,而不是解决这个目标的方法
我想为每个可继承的DerivedX_创建一个“final”类,该类是非模板的,并将自身作为W参数传递
这正是在您生成的代码中完成的:
struct Derived1: public Derived1_inheritable<Derived1> {}
struct-Derived1:public-derived1u可继承{}
这是一个类型定义(创建一个“final”类)。您的CRTP基础需要最终用户提供的参数,而转发构造函数的需要只是您设计的一个副作用。我想我找到了一个优雅的解决方案:
template <class W>
struct Base
{
.....
};
template <class W>
struct Derived_inheritable: public Base<W>
{
....
}
//solution
struct Derived2_dummy;
template <class W=derived2d_ummy>
struct Derived2_inheritable: public Derived_inheritable<W>
{
....
}
struct derived2_dummy: public: Derived_inheritable<>{};
typedef Derived2_inheritable<> Derived2;
模板
结构基
{
.....
};
模板
结构派生\u可继承:公共基
{
....
}
//解决方案
结构派生的2_虚拟;
模板
结构派生2_可继承:公共派生的_可继承
{
....
}
struct-derived2_-dummy:public:Derived_-inheritable{};
typedef-derived2u可继承的Derived2;
我不能说你的例子很有启发性,而问题的措辞,一个最终的中间类,是自相矛盾的。你到底想实现什么?这里的Intermediate意味着我拥有从彼此派生的CRTP类,直到最终的派生类将自身作为CRTP参数传递并完成继承链。我想做的是能够在CRTP继承链的每个级别上都有这样的“最终”类。我认为最好的方法是编写显示类层次结构的代码。我想typedef行是这里让人困惑的地方,所以我在第一个答案的评论中对此进行了澄清。是的,这是一个副作用,我正在寻找一种方法来弥补它,在每个级别定义最终用户类,不涉及模板。我正在寻找一个替代我找到的解决方案,因为我不想创建(如果可能的话,也不想创建typedef)额外的类(和构造函数)@AlexanderVassilev:不管你喜欢与否,这就是你的设计所导致的结果。你在那里无能为力。您可以尝试编写一个宏,该宏将使用一些锅炉板,但是您需要定义一个新类型,并且该类型必须有一个构造函数,并且得出相同的结论。我没有其他方法可以实现这种设计的好处,因此与好处相比,这种不便是相当小的。谢谢你的帮助。