我想写一个这样的函数:
template<class T1, T2>
T2 getvalue(T1 in)
{
T2 tmp;
// do some work here
return T2;
}
以这种方式打电话:
float x[100];
int x=getvalue<int>(x);
但似乎我不能这样做。想法是编译器从使用中检测T1,但我定义了返回类型。但上面的代码会产生错误。
关于我如何做到这一点的任何建议?
答案 0 :(得分:5)
当您明确指定函数模板参数时,它们将从 left 填充;推断出所有剩余的论点。所以你必须这样写:
template <typename T, typename U>
T getvalue(U in)
{
return in;
}
用法:
auto x = getvalue<int>(1.5); // x is an "int", and U is deduced as "double"
答案 1 :(得分:2)
首先,你有一个错字。在return
语句中,您尝试返回的是类型,而不是名称。变化:
return T2;
为:
return tmp;
其次,模板参数列表中还有一个语法错误。您需要在{em>每个模板参数名称前面加上class
或typename
(我更喜欢typename
,但这就是我):
template<typename T1, typename T2>
最后,您可以通过将返回类型作为第一个模板参数来获得演绎效果:
template<typename T1, typename T2>
T1 getvalue(T2 in)
{
T1 tmp;
// do some work here
return tmp;
}
Decuction现在可以按预期工作:
bool b = getValue <bool> (42.0);
原因是模板参数从 left 到 right 进行评估,而不是按任意顺序。一旦应用了最左边的模板参数,编译器将尝试推导出未指定的任何模板参数。
答案 2 :(得分:0)
好问题,模板在C ++中会变得棘手。
正确编写的版本:
template<typename T1, typename T2>
T2 getvalue(T1 in)
{
T2 tmp;
// do some work here with tmp
return tmp;
}
根据你的例子调用正确的方法:
float x[100]; //array of 100 floats. depending on your application, best practice would suggest to initial the values in the array to 0.
int x=getvalue<double, int>(3.5); //note int x is different than float x[].
您的函数当前正在返回int。如果要返回浮点数的数组,模板参数也应该反映出来。 最好始终指定两个模板参数。记住功能模板不能像类模板那样部分专业化(仅完全)
只是我的0.02美元