gpt4 book ai didi

c++ - 如何在 C++ 中使用泛型函数?

转载 作者:可可西里 更新时间:2023-11-01 16:59:15 26 4
gpt4 key购买 nike

我写了这段代码,如果我取消注释倒数第二行,我会得到错误 - “模板参数推导/替换失败:”。是因为 C++ 中泛型函数的某些限制吗?此外,我的程序不会打印数组 b 的 float 答案。有什么我可以做的吗? (很抱歉在单个帖子中问了 2 个问题。)
P.S: 我刚开始学C++。

#include <iostream>
using namespace std;

template <class T>
T sumArray( T arr[], int size, T s =0)
{
int i;
for(i=0;i<size;i++)
{ s += arr[i];
}
return s;
}

int main()
{
int a[] = {1,2,3};
double b[] = {1.0,2.0,3.0};
cout << sumArray(a,3) << endl;
cout << sumArray(b,3) << endl;
cout << sumArray(a,3,10) << endl;
//cout << sumArray(b,3,40) << endl; //uncommenting this line gives error

return 0;
}


编辑 1:将 40 更改为 40.0 后,代码有效。这是我得到的输出:
6
6
16
46
在第二种情况下,我仍然没有得到 float 答案。有什么建议吗?

最佳答案

原因是编译器无法推导出T的类型。

对于您的最后一个示例,它应该如何理解 T 是什么?第一个参数(b)的类型是double[],而在函数定义中是T[]。因此看起来 T 应该是 double。但是,第三个参数 (40) 的类型是 int,所以看起来 T 应该是 int .因此错误。

40 更改为 40.0 使其工作。另一种方法是在模板声明中使用两种不同类型:

#include <iostream>
using namespace std;

template <class T, class S = T>
T sumArray( T arr[], int size, S s =0)
{
int i;
T res = s;
for(i=0;i<size;i++)
{ res += arr[i];
}
return res;
}

int main()
{
int a[] = {1,2,3};
double b[] = {1.0,2.0,3.1};
cout << sumArray(a,3) << endl;
cout << sumArray(b,3) << endl;
cout << sumArray(a,3,10) << endl;
cout << sumArray(b,3,40) << endl; //uncommenting this line gives error

return 0;
}

请注意,我必须将 s 显式转换为 T,否则最后一个示例将丢失小数部分。

但是,此解决方案仍然不适用于 sumArray(a,3,10.1),因为它会将 10.1 转换为 int,因此如果这也是一个可能的用例,则需要更准确的处理。一个使用 c++11 功能的完整示例可能是这样的

 template <class T, class S = T>
auto sumArray(T arr[], int size, S s=0) -> decltype(s+arr[0])
{
int i;
decltype(s+arr[0]) res = s;
...

此模板函数的另一个可能的改进是自动扣除数组大小,请参阅 TartanLlama 的回答。

关于c++ - 如何在 C++ 中使用泛型函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32251793/

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