gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:04:57 29 4
gpt4 key购买 nike

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

这是一个示例文件:

P11
3 4
512

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

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

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

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

我有 10 个案例需要考虑,每个案例看起来像这样 -> 如果魔数(Magic Number)是 P11 并且最大值小于 256,那么数据类型是“unsigned char”。如果魔数(Magic Number)是 P11 并且最大值大于 256 但小于 65536,那么我们图像的数据类型将是“unsigned short”。我根据魔数(Magic Number)和最大值来完成这个。所以对于我们上面的图像,我们将有一个数据类型“unsigned short”。

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

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

最佳答案

你的问题实际上不是字符串模板,如果你有整数你会有同样的问题这是将实时值转换为编译时模板的基本难题datatype 是在运行时确定的——因此编译器无法知道运行时它是什么类型即使你使用 ifs - 你不能在运行时决定 img1 的类型然后在下面使用它,你将不得不在循环中调用你的所有方法,或者如评论有一个公共(public)基类

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

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 - 希望这足以让您继续致力于此。

关于c++ - 将数据类型作为字符串放入模板参数中 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19966851/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com