我很确定答案是“你不能使用模板,你必须使用虚函数(动态多态性)”,但如果我走那条路,我似乎必须复制很多代码.这是设置:
我目前有两个类,ColorImageSegmentation 和 GrayscaleImageSegmentation。他们做的事情本质上是一样的,但是有3个区别 - 它们对不同类型(ColorImage 和 GrayscaleImage)进行操作 - 一个参数,直方图的维度(3 vs 1)不同 - PixelDifference 函数根据图像类型不同
如果我创建一个类
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>();
关于c++ - "run time templates",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4233300/