多くの (数百の) ポインターを含む構造があります。各ポインターは異なる型ですが、それらはすべて共通の基本クラスから継承されます --- それを Base と呼びましょう。多重継承を使用しています。(これはすべて機械生成であるため、奇妙です。)
例えば:
class Data {
Class1* p1;
Class2* p2;
Class3* p3;
...etc...
};
これらすべてに対して、Base で定義されたメソッドを呼び出したいと考えています。次のようなコードを生成できます。
void callFooOnData(Data* p)
{
if (p1) p1->Foo();
if (p2) p2->Foo();
if (p3) p3->Foo();
...etc...
}
問題は、10 億もの異なる種類のデータがたくさんあり、上記のコードが非常に大きくなり、フットプリントに影響を与えていることです。だから私はこれをもっと賢いものに置き換えようとしています。
C では、単純に最初の構造体メンバーのアドレスとカウントを取得して、次のようにすることができます。
void callFooOnData(Data* p)
{
callFooOnObjects(&p1, 3);
}
しかし、もちろん、これを C++ で行うことはできません。なぜなら、構造体のメンバーは統一された型ではなく、それらを Base* にキャストするには、それらを変更する必要があり、これにはポインターを変更する必要がある可能性があります。統一型のポインターは、メンバーごとに異なる方法で変更する必要がありますが、それはできません。
このようなことをC++で行う方法はありますか? これはすべて機械で生成されたコードなので、きれいである必要はありません。ありがたいことに --- そのサメはすでにジャンプされています --- しかし、可能な限り移植性が必要です...
(私は RTTI にアクセスできますが、パフォーマンス上の理由から、可能であれば避けたいと考えています。)
アップデート:
だから、私が知る限り... C++ではこれを行うことはできません。単純にできません。C では完全に単純であるという事実に惑わされました。C++ では、クラス階層内の 2 つの型の間でポインターを安全にキャストできるのは、最初から適切に型指定されたポインターがある場合のみです。もちろん、私はそうではありません。
したがって、これを回避するために根本的な問題を変更する必要があります: 私が思いついた解決策は、すべてのポインターを構造体に 2 回格納することです。 * メソッドの呼び出し用。もちろん、データ構造のサイズが 2 倍になるので、これは最悪です。
したがって、誰かがこれを確認したい場合 (私が間違っていることを証明したいと思います)、私は喜んで彼らの答えを正しいものとしてマークします...