如何在C ++中创建其数据类型未知的模板类

时间:2013-11-13 19:09:07

标签: c++ templates types

我想创建一个图像模板类。此类将从文件中读取图像数据并将数据存储在其成员变量中。 图像的数据类型存储在图像的标题中,之前不知道。

如何在不知道图像数据类型的情况下创建图像模板类?图像读取功能将读取标题,并根据数据的数据类型分配该内存。

由于

2 个答案:

答案 0 :(得分:4)

模板无法自动执行此操作。模板允许您延迟处理类型的(某些)特定细节,直到编译时而不是编写代码时 - 但是编译代码时,必须知道用作模板参数的类型和值的所有细节。他们专门做 not 处理类型的变化,直到你在这里处理时才会知道这些变体。

您正在讨论的内容听起来更像是与经典OOP模型更紧密地结合,具有基础“Image”类,以及每种类型图像的派生类(例如,BmpImage,JpegImage,TiffImage等。 )然后你有一些ImageFactory类读入数据,实例化一个派生自Image的类型的对象,最后返回一个Image *到新定义的对象,以便客户端代码可以显示,操作等等,图像根据需要。

显而易见的替代方案(也广泛使用)是读取外部数据,从其外部格式转换为某种统一的内部格式,并创建表示该内部格式的图像的对象。例如,在Windows上,您可能会读取外部文件并将它们全部转换为Windows位图。

答案 1 :(得分:1)

就动态输入而言,你不能直接使用模板(模板实现静态多态)

如果你知道所有类型的图像,你可以结合两种方法:声明一个抽象类并用这些类型实例化你的模板类(从base派生),并使用一种工厂来创建相应的类。

class base
{
public:
    virtual int getWidth() = 0;
};

template <class T> class ImageOfSomeType : public base
{
public:
   virtual int getWidth() { return width; };
};
// in a cpp file:
//The explicit instantiation part
template class ImageOfSomeType <MyType1>; 
template class ImageOfSomeType <MyType2>;

在某些地方()

base * createImage()
{
   ...
   if (image_type == "type1") return new ImageOfSomeType<MyType1>;
   ...
}