我敢肯定,答案是“您不能使用模板,必须使用虚函数(动态多态性)”,但是如果走那条路,似乎必须重复很多代码。这是设置:
我目前有两个类,ColorImageSegmentation和GrayscaleImageSegmentation。他们做的基本上是同一件事,但是有三个区别
-它们适用于不同的类型(ColorImage和GrayscaleImage)
-参数,直方图的维度(3比1)不同
-PixelDifference函数根据图像类型而有所不同
如果我创建一个类(class)
template <TImageType>
class ImageSegmentation
{
};
我会好起来的。但是,我希望将此对象作为另一个类的成员:
class MyMainClass
{
ImageSegmentation MyImageSegmentation;
};
但是用户需要确定
MyImageSegmentation
的类型(如果用户打开了灰度图像,我想实例化MyImageSegmentation<GrayScaleType>
。同样对于彩色图像MyImageSegmentation<ColorType>
。)使用派生类,我可以存储一个指针,然后执行以下操作:
class MyMainClass
{
ImageSegmentation* MyImageSegmentation;
};
... user does something...
MyImageSegmentation = new ColorImageSegmentation;
但是我该如何使用模板做类似的事情?问题是我有很多:
typedef TImageType::HistogramType HistogramType;
typedef TImageType::PixelType PixelType;
诸如此类的事情,所以我不知道如何在不复制大量代码的情况下将它们转换为动态多态模型。
对不起,我有任何建议吗?
谢谢,
大卫
最佳答案
也许您还没有告诉我们其他要求,但是到目前为止,您可以将类型传递给包含类:
template<typename TImage>
class MyMainClass
{
ImageSegmentation<TImage> MyImageSegmentation;
};
您很可能需要某些层的动态调度,但是只需要最高的抽象层:
struct IMainClass
{
virtual bool SaveToFile(std::string filename) = 0;
virtual bool ApplySharpenFilter(int level) = 0;
...
};
template<typename TImage>
class MyMainClass : public IMainClass
{
ImageSegmentation<TImage> MyImageSegmentation;
public:
virtual bool SaveToFile(std::string filename);
virtual bool ApplySharpenFilter(int level);
};
IMainClass* pMain = new MyMainClass<GrayscaleImage>();