(C++ で) テンプレート化されたメンバー関数 (非テンプレート クラスの) を仮想にしたいという設計上の問題が発生しており、問題を回避する適切でエレガントな方法があるかどうか疑問に思っています。
シナリオは次のとおりです。一般的なアイテムを処理する機械があります。各マシンが独自の処理方法を定義できるように、仮想プロセス (アイテム)関数を備えたマシンの抽象基本クラスを使用します。問題は、アイテムが処理方法について特定のインターフェイスを公開するという点で、アイテムも「一般的」であることです。理由から (主にパフォーマンスのため... vtable のオーバーヘッドがないため)、これらのアイテムにはコンパイル時のポリモーフィズムを使用したいと思います。これで、各マシンは次のようなインターフェイスを持つようになります。
class Machine
{ public:
template <typename T>
virtual void process(T& item) = 0;
};
ただし、テンプレート化されたメンバー関数は仮想化できないため、これは C++ では不可能です。確かに、Item タイプ T でテンプレート化されたマシン クラスを作成できますが、これにより、より大きな設計スキームでさらに頭痛の種が増え、実際には Machine クラスの他の部分は Item に依存しません...それは process() 関数の引数にすぎません.
これを回避するより良い方法、または汎用アイテムのファミリを処理するこの種の汎用マシン ファミリを提供する方法についての提案はありますか (アイテムはコンパイル時のポリモーフィズムを使用します)。私は私のデザインの面で深いところから外れていますか?
提案に感謝します