私がクラスを持っていると仮定します
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
他の人は引き続きクラス を使用するため、自分のコードを他の人のコードとやり取りさせたい場合は私もクラス を使用します。A
B
A
- これは、複数のスーパークラスに「スケーラブル」であることが望ましいです。したがって、 も の
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>
ようにし、ライブラリが 型のオブジェクトを取得するというものです。C
bar
C