性能上の理由から、仮想関数を避けるためにCuriously Reoccuring Template Patternを使用しています。何百万回も実行する小さなコマンドがたくさんあります。これをコマンドパターンに合わせようとしています。たくさんのコマンドをキューに追加し、それぞれを1つずつ実行しながら繰り返したいと思う。各コマンドは、CRTPを使用して仮想関数を回避します。私が取り組んでいる問題は、通常、コマンドパターンはポインタのベクトルを使って実装されているということです。しかし、Commandクラスがテンプレート化されると、ジェネリックコマンドポインタを渡すのが難しくなります。私はC++のエキスパートではないので、おそらくテンプレート化されたコマンドオブジェクトのベクトルを保存する明白な方法がありますか?そうCommand* command
は、コンパイルエラーを与え、問題はCommand
がタイプではないです仮想関数のないコマンドパターン(C++)
boost:ptr_vector commands;
AddCommand(Command* command) {
commands.push_back(command);
}
:私はのようなものを使用しようとしています。私はCommand<CommandType>
を使用する必要がありますが、異なるタイプのコマンドを保持するためにキューが必要なので動作しません。
解決策はありますか?または、仮想関数は私の唯一のオプションですか?
ADDED:コマンドオブジェクトは、モンテカルロシミュレーションアルゴリズムの一部です。だから、Commandは正規分布からの乱数で、正規分布のパラメータはクラスの一部です。コマンドパターンは非常にきれいです。私は、特定の順序で、状態を維持する必要のある関数に多くの呼び出しを持っています。
コマンドの例が参考になります。小さなコマンドテンプレートクラスがたくさんある場合、1または2を例として投稿すると、人々は代替案を提案するのに役立ちます。少なくとも、将来の読者のための質問の理解を向上させるでしょう。 –
コマンドパターンを使用して解決している特定のシナリオに関するさらに詳しい情報を提供できますか?また、なぜ仮想関数が遅すぎると思うかを説明してください。あなたは仮想関数を使ってそれを実装しましたが、それは遅すぎると感じましたか? –