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
}
コード内のコメントにあるように、これはあまり洗練されたソリューションではありません。コンストラクターを再定義して、基本コンストラクターに転送する必要があります。もっとエレガントな方法を知っている人はいますか?