0

我有一个 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
}

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

4

2 回答 2

1

typedef Derived1_inheritable Derived1;

那行没有意义,模板的参数是一个类型,但您试图传递一个模板(顺便说一下,您正在实例化的模板是同一个模板,但除了那个额外的怪癖之外,事实是您的模板将一个类型作为参数,而您正在传递非类型)

从问题中并不清楚您要达到什么目标。你应该努力陈述你的目标,而不是你解决这个目标的方法。

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

这正是在您生产的代码中完成的:

struct Derived1: public Derived1_inheritable<Derived1> {}

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

于 2012-04-17T13:12:52.057 回答
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;
于 2012-04-19T09:40:25.330 回答