私の実際のアイデアは、C++ 言語の制限 (テンプレート化された仮想関数はサポートされていません) のため、コンパイルではありません。次のコード スニペットについて、いくつかの設計上の推奨事項があるかもしれません。
さまざまな種類の入力に対してさまざまなアルゴリズムを実行したいと考えています。たとえば、入力として積分画像とグレースケール画像があります。インテグラル イメージには 1 ピクセルに 32 ビットが必要で、グレースケール イメージには 8 ビットが必要です (例として)。したがって、次の 2 つのチャネルがCChannel<uint8>
あります。CChannel<uint32>
1 つの画像に対して複数のチャネルを使用できるため、チャネルをベクトルに格納しますstd::vector<CChannelBase*>
。これが class の正当な理由ですCChannelBase
。
class CChannelBase
{
public:
virtual ~CChannelBase( void ) = 0;
};
template <class ValueType>
class CChannel : public CChannelBase
{
public:
typedef ValueType value_type_t;
Channel(): m_data_p(0) {}
void setData(ValueType* f_data_p) { m_data_p = f_data_p; }
const ValueType getData( void ) { return m_data_p; }
private:
ValueType* m_data_p;
};
私のすべてのアルゴリズムはインターフェイスを実装し、各画像チャネルと互換性がある必要があります。
class IAlgorithmInterface
{
public:
virtual ~IAlgorithmInterface() = 0;
template <class ValueType>
virtual void doWork(const CChannel<ValueType>* f_channel_p, float32_t& f_result_r);
};
class CAlgorithmA : IAlgorithmInterface
{
CAlgorithmA() {...};
~CAlgorithmA() {...};
template <class ValueType>
void doWork(const CChannel<ValueType>* f_channel_p, float32_t& f_result_r) {...};
};
class CAlgorithmB : IAlgorithmInterface
{
CAlgorithmB() {...};
~CAlgorithmB() {...};
template <class ValueType>
void doWork(const CChannel<ValueType>* f_channel_p, float32_t& f_result_r) {...};
};
もちろん、仮想テンプレート関数があるため、このコードはコンパイルされません。とにかく、この問題を克服するための素敵なデザインを探しています。解決策は、すべてのクラス ( IAlgorithmInterface
、CAlgorithmA
、CAlgorithmB
) をテンプレート化することです。これは、私がやりたくないことです。ここで、訪問者パターンが推奨されている投稿をいくつか見ました。しかし、正直なところ、私の場合はそれを使用する方法がわかりません。