Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CRTP中间类,也需要最终确定_C++_Templates_Crtp - Fatal编程技术网

C++ 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

我有一个CRTP类的继承链。CRTP类彼此派生,直到“final”派生类将自身作为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>
{
....
}

...
模板
结构基
{
.....
};
模板
结构派生\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:不管你喜欢与否,这就是你的设计所导致的结果。你在那里无能为力。您可以尝试编写一个宏,该宏将使用一些锅炉板,但是您需要定义一个新类型,并且该类型必须有一个构造函数,并且得出相同的结论。我没有其他方法可以实现这种设计的好处,因此与好处相比,这种不便是相当小的。谢谢你的帮助。