由于 C++ 语言限制(不支持模板化的虚函数),我的实际想法不是编译。也许你们中的一些人对以下代码片段有一些设计建议。
我想在不同类型的输入上运行不同的算法。例如,我有一个积分图像和一个灰度图像作为输入。积分图像需要 32 位像素,而我的灰度图像需要 8 位(仅作为示例)。因此,我有两个渠道:CChannel<uint8>
和CChannel<uint32>
因为我可以为单个图像有多个通道,所以我将通道存储在一个向量中,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
)都被模板化,这是我不想做的事情。我在这里看到了一些帖子,其中推荐了访问者模式。但老实说,我不知道如何在我的情况下使用它。