0

我正在编写一个程序,该程序需要创建具有不同数据类型的某些图像。我正在使用模板,因为这是最好的方法。程序读取一个图像文件,顶部有一个幻数(P11,P12,P13,P14),幻数下方是三个指定宽度、高度和最大值的数字。文件的其余部分包含 (width*height) 数量的数字,所有这些数字必须在 0 和最大值之间。

这是一个示例文件:

P11
3 4
512

78 90 102
23 489 209
123 423 1
100 231 134

请注意,这只是一个示例,我们的文件通常有数千行。

对于这个程序,我们必须检查标头中的幻数和最大值。这些值决定了我们使用的数据类型,因此我们只需将其插入模板。问题是我的模板不能像这样将字符串作为参数:

string dataType = inFile.getType(vector of numbers);
Image<dataType> img1 (Rows,columns,numbers);

我需要考虑 10 个案例,每个案例看起来像这样-> 如果幻数是 P11 并且最大值小于 256,那么数据类型是“无符号字符”。如果幻数是 P11 并且最大值大于 256 但小于 65536,那么我们图像的数据类型将是“无符号短”。我通过这个取决于幻数和最大值是什么。所以对于我们上面的图像,我们将有一个“无符号短”的数据类型。

到目前为止,我所拥有的是一种方法,它考虑了每种情况并返回一个字符串,告诉我关于幻数和最大值的数据类型应该是什么。唯一的问题是我的模板不能接受一个字符串来使其成为正确的数据类型。

我想出的唯一解决方案是在主体中执行 if-else 语句。这很混乱,因为如果我有多个图像,if-else 语句就会加倍。这是一个例子

if(dataType == "unsigned char"){
   Image<unsigned char> img1 (rows, columns, numbers);

}
else if(dataType == "unsigned short"){
   Image<unsigned short> img1 (rows, columns, numbers);   

}

对于其他 8 种情况,依此类推...无论如何我可以从方法返回数据类型并将其直接放入模板参数中吗?我可以提交一些代码,但不是很多,因为我不希望其他学生寻找简单的出路。让我知道什么是最有益的,我可以改变它。感谢您在高级的帮助。

4

1 回答 1

2

你的问题实际上不是字符串模板,如果你有整数,你会有同样的问题这是将实时值转换为编译时模板的基本困境 datatype是在运行时确定的 - 所以编译器不知道它将是什么类型运行时即使您使用 ifs - 您也无法在运行时决定 img1 的类型然后在下面使用它,您必须要么调用循环中的所有方法,要么如注释所述具有公共基类

来说明使用上面提到的基类和静态工厂:

template <typename T> class img; // forward declare
class img_base
{
public:
    virtual void process();
    static img_base * get_processor(int type)
    {
         switch (type)
         {
            case 0:
                return new img<unsigned char>;
            case 1:
                return new img<unsigned short>;
         .....

}

template <typename T>
class img : public img_base
{
public:
    void process(); // do type specific stuff
}

正如评论的那样,这需要一个 int - 希望这足以让您继续努力。

于 2013-11-14T00:38:56.977 回答