将数据类型作为字符串放入模板参数 - C ++

时间:2013-11-13 23:51:17

标签: c++ string oop templates methods

我正在编写一个需要使用不同数据类型创建某些图像的程序。我正在使用模板,因为这是最好的方法。程序读入的图像文件中,幻数下方的顶部(P11,P12,P13,P14)带有幻数,是指定宽度,高度和最大值的三个数字。文件的其余部分包含(宽度*高度)数字量,所有这些数字必须在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个需要考虑的案例,每个案例看起来都像这样 - &gt;如果幻数为P11且最大值小于256,则数据类型为“unsigned char”。如果幻数为P11且最大值大于256但小于65536,则我们的图像的数据类型将为“无符号短”。我会根据幻数和最大值来完成此操作。因此,对于上面的图像,我们的数据类型为“unsigned short”。

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

我提出的唯一解决方案是在主要方面做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个案例

等等...反正我是否可以从方法中返回数据类型并将其直接放入模板参数中?我可以提交一些代码,但不是很多,因为我不希望其他学生寻找一个简单的方法。让我知道什么是最有益的看,我可以改变它。感谢您提供的帮助。

1 个答案:

答案 0 :(得分: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 - 希望这足以让你继续这个。