C++ で、定義済みクラスのスーパークラスを遡及的に定義するのに最も近いものは何ですか? 質問する

C++ で、定義済みクラスのスーパークラスを遡及的に定義するのに最も近いものは何ですか? 質問する

私がクラスを持っていると仮定します

class A {
protected:
    int x,y;
    double z,w;

public:
    void foo();
    void bar();
    void baz();
};

私のコードや他の人のコードで定義され、使用されています。今、私は A をうまく操作できるライブラリを書きたいと思っていますが、実際にはもっと汎用的で、次のものを操作できます。

class B {
protected:
    int y;
    double z;

public:
 void bar();
};

私は自分のライブラリを汎用的なものにしたいので、B クラスを定義し、その API がそのクラスを使用します。

私は、もう制御できない A の定義ではなく、おそらく B の定義のどこか他の場所で、コンパイラに次のことを伝えたいと思っています。

B見てください、を のスーパークラスとして考えてみてください。したがって、特に、を として再解釈した場合に、 を期待するコードが機能するAように、メモリ内にレイアウトしてください。そして、を として(およびなどとして)実際に受け入れてください。A*B*B*A*B*A&B&

C++ では、これを別の方法で実行できます。つまり、B が制御していないクラスである場合、 ; を使用して「既知のクラスをサブクラス化する」操作を実行できますclass A : public B { ... }。また、C++ には反対のメカニズム (「新しいクラス B で既知のクラス A をスーパークラス化する」) がないことはわかっています。私の質問は、このメカニズムに最も近い近似値は何ですか?

ノート:

  • これらはすべて厳密にはコンパイル時であり、実行時ではありません。
  • あり得るいいえは にまったく変更されませんclass A。 の定義と の両方を認識しているコードのみを変更できます。B他の人は引き続きクラス を使用するため、自分のコードを他の人のコードとやり取りさせたい場合は私もクラス を使用します。ABA
  • これは、複数のスーパークラスに「スケーラブル」であることが望ましいです。したがって、 も のclass C { protected: int x; double w; public: void baz(); }スーパークラスのように動作するはずですA

ベストアンサー1

次の操作を実行できます。

class C
{
  struct Interface
  {
    virtual void bar() = 0;
    virtual ~Interface(){}
  };

  template <class T>
  struct Interfacer : Interface
  {
    T t;
    Interfacer(T t):t(t){}
    void bar() { t.bar(); }
  };

  std::unique_ptr<Interface> interface;

  public:
    template <class T>
    C(const T & t): interface(new Interfacer<T>(t)){}
    void bar() { interface->bar(); }
};

アイデアは、裏で型消去 ( および クラス) を使用して、Interfaceで呼び出すことができるものをすべて取得できるInterfacer<T>ようにし、ライブラリが 型のオブジェクトを取得するというものです。CbarC

おすすめ記事