Dav*_*ria 4 c++ polymorphism templates
我很确定答案是"你不能使用模板,你必须使用虚函数(动态多态)",但似乎我必须复制很多代码,如果我去那条路线.这是设置:
我目前有两个类,ColorImageSegmentation和GrayscaleImageSegmentation.它们基本上是相同的,但有三个不同 - 它们在不同的类型(ColorImage和GrayscaleImage)上运行 - 一个参数,直方图的维度(3对1)是不同的 - PixelDifference函数根据图像类型而不同
如果我创建一个类
template <TImageType>
class ImageSegmentation
{
};
Run Code Online (Sandbox Code Playgroud)
我会很好的.但是,我希望将此对象作为另一个类的成员:
class MyMainClass
{
ImageSegmentation MyImageSegmentation;
};
Run Code Online (Sandbox Code Playgroud)
但是用户需要确定类型MyImageSegmentation(如果用户打开灰度图像,我想实例化MyImageSegmentation<GrayScaleType>.同样对于彩色图像,MyImageSegmentation<ColorType>.)
使用派生类,我可以存储指针,然后执行:
class MyMainClass
{
ImageSegmentation* MyImageSegmentation;
};
... user does something...
MyImageSegmentation = new ColorImageSegmentation;
Run Code Online (Sandbox Code Playgroud)
但是我怎么用模板做这样的事呢?问题是我有很多:
typedef TImageType::HistogramType HistogramType;
typedef TImageType::PixelType PixelType;
Run Code Online (Sandbox Code Playgroud)
发生了一些事情,所以我不知道如何将它们转换为动态多态模型而不重复一大堆代码.
对不起,漫无目的...有人对我有什么建议吗?
谢谢,
大卫
也许还有其他要求你没有告诉过我们,但是从你到目前为止,你可以通过包含类传递类型:
template<typename TImage>
class MyMainClass
{
ImageSegmentation<TImage> MyImageSegmentation;
};
Run Code Online (Sandbox Code Playgroud)
您很可能需要一些动态调度层,但仅限于最高抽象级别:
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>();
Run Code Online (Sandbox Code Playgroud)