"运行时模板"

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)

发生了一些事情,所以我不知道如何将它们转换为动态多态模型而不重复一大堆代码.

对不起,漫无目的...有人对我有什么建议吗?

谢谢,

大卫

Ben*_*igt 5

也许还有其他要求你没有告诉过我们,但是从你到目前为止,你可以通过包含类传递类型:

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)