4

私はC++(C ++ 11)のテンプレート・シェナニガンを調べています。私が欲しいのは、抽象クラスの純粋な仮想型です。これはScalaの抽象型のようになります。C ++では、次のようなことをしたいと思います。

struct Base {
  // Says any concrete subclass must define Type, but doesn't
  // require that it be anything in particular.
  virtual typedef MyType; 
};

struct Derived : Base {
  // Won't compile unless this typedef exists.
  typedef int MyType;
};

これを行う方法はありますか?

4

2 に答える 2

5

C++でこれが本当に必要かどうかはわかりません。

そのような解決策を探しているデザイナーの立場に身を置くことを試みると、いくつかの型を何らかの構文規則に準拠させるために、この種の制約が必要になると思います。

おそらく、これが必要になるのは、ジェネリック アルゴリズムがその構文規則を必要とするためです。このような型の関連付けを定義しない型では機能しません。

たとえば、以下のアルゴリズムでは、引数の型に関連する が必要bar_typeです。

template<typename T>
bool foo(T t)
{
    typedef typename T::bar_type FT;
    FT ft;
    ...
}

しかし、この場合、の入力を効果的に制約するために を強制する必要はありません。単純に の型定義を省略しただけでは、その型を で使用することはできません。typedeffoo<>()bar_typefoo<>()

もちろん、これは、実際にそうしようとしてすぐに発見するものであり、それ以前ではありません。また、などの概念を定義し、HasBarTypeその概念を実現するためにいくつかの型を適用できると便利です。一方、概念はまだC++ の一部ではありません。概念は望ましいものですが、概念なしで生活することは可能です。

于 2013-03-04T19:46:51.390 に答える
0

編集

これは機能しませんが、不思議なことに繰り返されるテンプレート パターンを使用するのがよいと思います。

/編集

template<typename Dependent>
class Base : public Dependent {
    typedef typename Dependent::MyType MyType;
};

次に、不思議なことに繰り返されるテンプレート パターンを使用します。

struct Derived : Base<Derived> {
  // Won't compile unless this typedef exists.
  typedef int MyType;
};
于 2013-03-04T19:56:04.783 に答える