【问题标题】:Put a datatype as a string into a template argument - C++将数据类型作为字符串放入模板参数 - C++
【发布时间】:2013-11-26 19:49:08
【问题描述】:

我正在编写一个程序,该程序需要创建具有不同数据类型的某些图像。我正在使用模板,因为这是最好的方法。程序读取一个图像文件,顶部有一个幻数(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,那么我们图像的数据类型将是“无符号短”。我通过这个取决于幻数和最大值是什么。所以对于我们上面的图像,我们将有一个“无符号短”的数据类型。

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

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

【问题讨论】:

  • 那么模板究竟是如何成为最佳方法的呢?使用类层次结构和static 工厂方法。无论您做什么,请考虑 string 不是唯一可用的数据类型。
  • 或者更简单,在所有情况下都使用最大的类型。 “千”是一个小数目。

标签: c++ string oop templates methods


【解决方案1】:

您的问题实际上不是字符串模板,如果您有整数,您也会遇到同样的问题 这是将实时值转换为编译时间模板的基本困境 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 - 希望这足以让您继续进行此工作。

【讨论】:

  • 唯一建议:使用enum 而不是int 作为type 参数。
猜你喜欢
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 2019-04-24
  • 1970-01-01
  • 2021-03-27
  • 2015-07-29
相关资源
最近更新 更多