実行時に拡張機能を動的にロードするアプリケーションを作成しようとしています。Boost Preprocessor ライブラリを使用して、名前のリストを指定すると、名前ごとにクラスを宣言し (そして、それらすべてを AbstractPlugin クラスのサブクラスにします)、そのクラスを含む Boost MPL シーケンスを宣言するプリプロセッサ関数を作成しました。次に、その MPL シーケンス内のいずれかの型にキャストできる場合、AbstractPlugin へのポインターを試行するクラスを作成しました。ここでの問題は、プリプロセッサ関数が、作成してロードするすべての拡張機能の完全なリストを必要とすることです。各拡張機能を個別のファイルに登録できる手法はありますか?
アップデート:
私の状況説明は漠然としすぎていたと思いますので、より具体的に説明することにしました。
拡張タイプのコレクションを定義したいと思います。拡張子の種類ごとに、任意の数の拡張子が存在する可能性があります。実行時に、プログラムは外部ライブラリをロードし、エントリ ポイント関数を解決して呼び出し、結果としてポインタを取得します。次に、そのポインターをすべての登録済み拡張タイプにキャストしようとします ( を使用dynamic_cast
するため、拡張タイプのクラスはすべてポリモーフィックな基本クラスから継承されます)。拡張型へのキャストが成功した場合、キャストされたポインターは、その拡張型の特別なハンドラーへの呼び出しで使用されます。
拡張機能の種類の数はコンパイル時に認識されます (もちろん、拡張機能の数は無限です)。私のアプローチを使用すると、ローダー クラスはこの知識を使用して、拡張機能の種類ごとにハンドラーが存在するかどうかを確認します (存在しない場合、プログラムはコンパイルされません)。また、私のアプローチでは、拡張タイプのクラスにローダーに関する情報を強制することはありません (したがって、ローダーを変更するのは簡単です)。ただし、各拡張タイプがそれ自体を登録すると、より便利になります。