c++ - "run time templates"

标签 c++ templates polymorphism

我很确定答案是“你不能使用模板,你必须使用虚函数(动态多态性)”,但如果我走那条路,我似乎必须复制很多代码.这是设置:

我目前有两个类,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/

相关文章:

c++ - 使用 C++ 的词法分析器

generics - 将类型约束添加到派生类型F#(此代码不够通用)

mysql - Laravel 的回滚事务支持多态关系吗?

c++ - 如何使用变量名引用数组位置

c++ - 为什么容器分配器内部的 sizeof(T) 与单独分配器中的不同?

c++ - 在 C++ 中获取属于另一个具有多重继承的类的类的指针

c++ - 调用专用模板函数时强制编译时错误

java - 获取子类的实例,无需 if else 或反射或 switch-case

c++ - 成员赋值笛卡尔类 C++

c++ - 如何将类型传递给类