CRTP中间类,也需要最终

时间:2012-04-17 13:07:04

标签: c++ templates crtp

我有一个CRTP类的继承链。 CRTP类相互派生,直到“最终”派生类将自身作为CRTP参数传递并完成继承链。

template <class W>
struct Base
{
    .....
};
template <class W>
struct Derived_inheritable: public Base<W>
{
....
}

template <class W>
struct Derived2_inheritable: public Derived_inheritable<W>
{
....
}

...

我想要做的是能够在CRTP继承链的每个级别都有这样的“最终”最终用户类,它们不涉及模板:

typedef Derived1_inheritable<Derived1> Derived1;

正如您所猜测的,此typedef不起作用,因为它引用了自己定义的类型。问题是如何实现这一目标? 我能想到的方式是:

struct Derived1: public Derived1_inheritable<Derived1>
{
   //not convenient, need to redefine at least a forwarding constructor
}

正如代码中的注释所说,这不是一个非常优雅的解决方案 - 我需要重新定义构造函数以转发到基础构造函数。有谁知道更优雅的方式?

2 个答案:

答案 0 :(得分:1)

<击>     typedef Derived1_inheritable Derived1;

该行没有意义,模板的参数是类型,但是您试图传递模板(顺便提一下您正在实例化的模板,但除了这个额外的怪癖之外,事实是您的模板采用类型作为参数并且您传递的是非类型的

从问题中你想要达到的目标并不是很清楚。您应该着手说明目标而不是方法来解决该目标。

  

我想为每个非模板的DerivedX_inheritable创建一个“final”类,并将自身作为W参数传递。

这完全是在您制作的代码中完成的:

struct Derived1: public Derived1_inheritable<Derived1> {}

这是一个类型定义(制作“最终”类)。您的CRTP基础需要最终用户必须提供的参数以及转发构造函数的需要这一事实只是您设计的副作用。

答案 1 :(得分:0)

我想我找到了一个优雅的解决方案:

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;