パフォーマンス上の理由から、仮想関数を回避するために、不思議なことに繰り返し発生するテンプレートパターンを使用しています。何百万回も実行する小さなコマンドがたくさんあります。これをコマンドパターンに適合させようとしています。キューに大量のコマンドを追加してから、それらを繰り返し実行して、それぞれを1つずつ実行したいと思います。各コマンドは、仮想機能を回避するためにCRTPを使用します。私が遭遇している問題は、コマンドパターンが通常ポインターのベクトルを使用して実装されていることです。ただし、Commandクラスがテンプレート化されている場合、汎用Commandポインターを渡すのは困難になります。私はC++の専門家ではないので、テンプレート化されたコマンドオブジェクトのベクトルを格納する明白な方法があるのではないでしょうか。私は次のようなものを使おうとしています:
boost:ptr_vector commands;
AddCommand(Command* command) {
commands.push_back(command);
}
問題はCommand
型ではないためCommand* command
、コンパイルエラーが発生します。を使用するCommand<CommandType>
必要がありますが、さまざまな種類のコマンドを保持するためのキューが必要なため、それは機能しません。
ソリューションのアイデアはありますか?それとも、仮想関数は私の唯一の選択肢ですか?
追加:コマンドオブジェクトは、モンテカルロシミュレーションアルゴリズムの一部です。つまり、Commandは正規分布からの乱数であり、正規分布のパラメーターはクラスの一部です。したがって、コマンドパターンは非常にうまく適合します。状態を維持する必要のある関数に対して、特定の順序で多くの呼び出しがあります。