CRTPを使用する基本クラスがあると、型が派生クラスに依存する基本テンプレートクラスのメンバーを宣言しています。意図したように、次の作品ながら型が派生クラスに依存する基本テンプレートクラスのメンバーを宣言するにはどうすればよいですか?
:
template <class T> class BaseTraits;
template <class T> class Base {
using TypeId = typename BaseTraits<T>::TypeId;
TypeId id;
public:
Base() { id = 123; }
TypeId getId() { return id; }
};
class Derived;
template <> class BaseTraits<Derived> {
public:
using TypeId = int;
};
class Derived : public Base<Derived> {};
int main(int argc, char ** argv) {
Derived foo;
return foo.getId();
}
私は実装を簡素化することができれば、私は疑問に思います。 Base
テンプレートに2番目のテンプレートパラメータを追加して、BaseTraits
を簡単にしたり、取り除いたりすることもできます。しかし、上記のスニペットはすでに第2のテンプレートパラメータを削除しようとしています。私はBase
の2番目のテンプレートパラメータを含まないソリューションを探しています。
私は次のようなものを試してみたが、それはコンパイルされません:
error: invalid use of incomplete type 'class Derived'
template <class T> class Base {
using TypeId = typename T::TypeId;
TypeId id;
public:
Base() { id = 123; }
TypeId getId() { return id; }
};
class Derived : public Base<Derived> {
public:
using TypeId = int;
};
int main(int argc, char ** argv) {
Derived foo;
return foo.getId();
}
UPDATE:
- 私はC++ 14に制限されています。
Base
はテンプレートである必要があります。- パフォーマンスは必須です。
十分に宣言される前にクラスをテンプレートパラメータとして使用できないため、2番目の例はうまくいきません。あなたはそれらのクラスで何を達成したいですか?あなたは彼らがテンプレート化される必要があると確信していますか? –
@MarošBeťkoこれは不完全なクラスなので、不完全なクラスをテンプレートパラメータとして使用できます。 –
@MarošBeťkoBaseはDerivedのみがその型を知っているメンバーを宣言したいと思います。はい、私はテンプレートを使う必要があります。 – Flyer