すべて基本クラスから派生する複数のクラスがありますが、プラットフォームによっては、派生クラスの一部がコンパイルされないようになりました。基本クラスのオブジェクトを返すことができるクラスがありますが、派生クラスのすべての名前がハードコーディングされています。
実行時に、できればコンパイルされたクラスを判別して、リンクを削除し、代わりに動的にロード可能なライブラリを提供できるようにする方法はありますか?
あなたが実際に何を達成しようとしているのかはわかりませんが、ファクトリへのポインタとともに、名前をリストに追加するシングルトンコンストラクタを各派生クラスの実装ファイルに入れることができます。そうすれば、リストは常に最新であり、コンパイルされたすべてのクラスを作成できます。
一般に、C ++では、実行時型情報に依存することはお勧めできません。あなたが説明したことは、ファクトリパターンのようです。プラットフォームごとに特別なファクトリサブクラスを作成することを検討することをお勧めします。このサブクラスは、そのプラットフォームに存在するクラスについてのみ認識します。
これは、「コンパイル時のポリモーフィズム」またはテンプレートポリシーパラメータを使用する場所のように聞こえます。
アンドレイ・アレキサンドレスクによるモダンC ++デザインと、この本に基づく彼のロキの実装を参照してください。ウィキペディアのLokiページも参照してください。
実行時にクラス情報を取得するための厄介なコンパイラ固有のトリックがあります。私を信じてください、あなたはワームの缶を開けたくありません。
これを行う唯一の真剣な方法は、派生クラスのそれぞれで条件付きコンパイルを使用することだと私には思えます。#ifdefブロック内で、コンパイルされるクラス名を含む新しい定数を定義します。その後、名前はまだハードコーディングされていますが、すべて中央の場所にあります。
派生クラスの名前は、C++でハードコーディングする必要があります。それらを使用する他の方法はありません。したがって、コンパイルされたクラスを自動的に検出する方法がないだけでなく、その情報が存在する場合はその情報を使用する方法もありません。
名前に基づいて実行時にクラスを指定できる場合は、次のようになります。
std :: string foo = "Derived1"; ベース*オブジェクト=新しい"foo"; //または好きな表記-C++では機能しません
次に、「Derived1」がコンパイルされたかどうかを判断する機能が役立ちます。次のように、クラスを直接指定する必要があるためです。
ベース*オブジェクト=新しいDerived1; //C++で動作します
すべてのチェックはコンパイル時に行われます。
すべてのクラスに独自のダイナミックライブラリがある場合は、ライブラリが存在するかどうかを確認してください。