仮想関数の代わりにkind
フィールドを使用して動的ディスパッチを行う従来のコードがあります。仮想関数を使用しないC++動的ディスパッチ
// Base struct shared by all subtypes
// Plain-old data; can't use virtual functions
struct POD
{
int kind;
int GetFoo();
int GetBar();
int GetBaz();
int GetXyzzy();
};
enum Kind { Kind_Derived1, Kind_Derived2, Kind_Derived3 /* , ... */ };
struct Derived1: POD
{
Derived1(): kind(Kind_Derived1) {}
int GetFoo();
int GetBar();
int GetBaz();
int GetXyzzy();
// ... plus other type-specific data and function members ...
};
struct Derived2: POD
{
Derived2(): kind(Kind_Derived2) {}
int GetFoo();
int GetBar();
int GetBaz();
int GetXyzzy();
// ... plus other type-specific data and function members ...
};
struct Derived3: POD
{
Derived3(): kind(Kind_Derived3) {}
int GetFoo();
int GetBar();
int GetBaz();
int GetXyzzy();
// ... plus other type-specific data and function members ...
};
// ... and so on for other derived classes ...
、その後POD
クラスの機能のメンバーは次のように実装されています:それはこのようなものになります
int POD::GetFoo()
{
// Call kind-specific function
switch (kind)
{
case Kind_Derived1:
{
Derived1 *pDerived1 = static_cast<Derived1*>(this);
return pDerived1->GetFoo();
}
case Kind_Derived2:
{
Derived2 *pDerived2 = static_cast<Derived2*>(this);
return pDerived2->GetFoo();
}
case Kind_Derived3:
{
Derived3 *pDerived3 = static_cast<Derived3*>(this);
return pDerived3->GetFoo();
}
// ... and so on for other derived classes ...
default:
throw UnknownKindException(kind, "GetFoo");
}
}
POD::GetBar()
、POD::GetBaz()
、POD::GetXyzzy()
を、そして他のメンバーも同様に実装されています。
この例は簡略化されています。実際のコードには約12種類の異なるサブタイプPOD
と数十種類のメソッドがあります。 POD
の新しいサブタイプと新しいメソッドがかなり頻繁に追加されるので、そのたびにこれらのすべての文を更新する必要があります。
これを処理する一般的な方法は、関数メンバーvirtual
をPOD
クラスに宣言することですが、オブジェクトは共有メモリに存在するため、これを行うことはできません。これらの構造体に依存する多くのコードがプレーン・データであるため、共有メモリ・オブジェクトに仮想関数を持たせるための何らかの方法を見つけることができますが、そのようにしたくありません。
私はサブタイプメソッドを呼び出す方法に関するすべての知識が1つの場所に集約されるように、これをクリーンアップするための最良の方法を提案しています.カップルダースの機能。
私には、POD
をラップし、冗長性を最小限に抑えるためにテンプレートを使用するアダプタクラスを作成できます。しかし、私がその道を始める前に、他の人たちがこれをどのように扱っているか知りたいと思います。
あなたは多くがあったと述べましたこのクラスに応じてコードのあなたはそれにフィールドを追加することができますか、または構造は同じままにする必要がありますか? –
構造は基本的に同じでなければなりません。私たちは共有メモリにこれらのものの膨大な配列を持っており、既にメモリサイズの限界にぶつかっています。 –
複数のプロセスがすべて同じバージョンのライブラリを持つかどうか –