我正在尝试计算用户传入的两个数值的绝对值,但允许用户输入多种数据类型(即整数和双精度,或者char和浮点数)。我最初的想法是使用类似这样的函数:
template <class T1, class T2>
void findAbs(const T1& var1, const T2& var2)
{
cout<<"Enter two numbers: "<<endl;
cin>>var1>>var2;
cout<<abs(var1)<<" "<<abs(var2)<<endl;
}
如果这是正确的方法,我不知道如何在main函数中调用它,因为我似乎必须将参数声明为一种数据类型或另一种。任何帮助将不胜感激!
答案 0 :(得分:4)
首先,您的示例将无法编译,因为您通过const-reference获取参数,然后尝试从流中读取它们。你应该用非const引用来取它们。
修复后,你可以简单地使用这样的函数:
int main()
{
int i;
float f;
double d;
char c;
findAbs(i, f);
findAbs(c, d);
findAbs(d, i);
//etc.
}
当然,每个调用站点必须知道参数的类型。模板是纯粹的编译时构造。如果您希望以某种方式使用模板来区分最终用户输入c
,42
或-3.14
,则不能,因为运行时信息。
答案 1 :(得分:1)
我不知道我是如何在main函数中调用它的,因为我似乎必须将参数声明为一种数据类型。
不,在这种情况下可以推导出模板参数。但主要问题是operator>>
std::cin
修改了参数,因此您不应声明它们const
:
template <class T1, class T2>
void findAbs(T1& var1, T2& var2) {
std::cout << "Enter two numbers: " << std::endl;
std::cin >> var1 >> var2;
std::cout << std::abs(var1) << ' ' << std::abs(var2) << std::endl;
}
然后你应该可以打电话:
int x, y;
findAbs(x, y);
考虑为两个参数使用单个模板参数可能是明智的。
答案 2 :(得分:0)
是的,但这取决于您传入的类型是否会导致一段有效的代码。在头脑中展开模板(或者输入,无论如何)。对类型abs
和T1
的变量调用T2
是否有意义?会编译吗?拨打cin
怎么样?如果是,那么是的,您的代码将起作用。