C++ 何时需要指定类型a模板
我编写了一个简单的模板来查找参数列表中的最小值C++ 何时需要指定类型a模板,c++,templates,function-templates,C++,Templates,Function Templates,我编写了一个简单的模板来查找参数列表中的最小值 template<typename T> T smallerList(T a, T b) { std::cout << "a= " << a << " b= " << b << std::endl; return a < b ? a : b; } template<typename T, typename... Rest> T smaller
template<typename T>
T smallerList(T a, T b) {
std::cout << "a= " << a << " b= " << b << std::endl;
return a < b ? a : b;
}
template<typename T, typename... Rest>
T smallerList(const T& param0, const Rest&... rest) {
T temp = smallerList(rest...);
return param0 < temp ? param0 : temp;
}
int main()
{
// Works, returns "3"
std::cout << "Smaller: " << smallerList(4, 5, 6, 3, 7) << std::endl;
// Sort of works, returns "2". Should be "2.14".
std::cout << "Smaller: " << smallerList(3.14, 43534, 100.2, 3.13, 2.14) << std::endl;
}
进入
T temp=smallerList(其余…);
此更改后,函数将按预期打印2.14
我的问题:为什么我需要指定类型?我认为模板函数是为每个被调用的类型“创建”的?好的,我不知道如何真正帮助您,因为我不知道您想要什么样的确切逻辑。但在变量模板中,允许类型混合,在第二个向量中,传递一个整数-
43534
,因此当递归回滚时,当2.14
反向传播时,得到如下结果
return(int)(43534<2.14?43534:2.14)代码>
因为43534
将是param0
,并且您采用param0
的返回类型,2.14
将转换为2
。接下来,它被转换回一个浮点数
,但您看不到它
您需要检查参数的类型是否相同,或者提出一些逻辑来提升参数。如果您使用43534.0
,它并不是像您期望的那样工作,因为它不再是int
编辑:
T temp=smallerList(其余…)代码>这并不能真正帮助您,它会改变行为,强制每个参数转换为第一个参数的类型。嗯,它变得更加一致。但是试试看:
smallerList(7, 10.5, 10, 3.13, 2.14)
它会坏的。我不能100%确定原因,但我猜它不能匹配递归的结尾,因为它将查找smallerList(int,float)
,而您的终止符模板将不匹配
您将需要以下内容:
template<typename T, typename U>
T smallerList(T a, U b) {
std::cout << "a= " << a << " b= " << b << std::endl;
return a < b ? a : b;
}
模板
T小列表(T a,U b){
std::cout Ok,smallerList(3.1443534100.2,3.13,2.14)的返回类型应该是什么
为什么?你能想出一个标准吗?啊,当然。我没有注意到double列表中的unsigned。我本来希望variadic模板有一个单一类型,但是列表中的每个值都会实例化一个新的smallerList函数。该类型不会传播。是的,你必须更改终止符模板的定义ate处理混合类型,因为如果第一个参数的类型与最后一个参数的类型不同,则当前版本将不匹配。auto
来自c++14,或者std::common_type
可能会有所帮助。
smallerList(7, 10.5, 10, 3.13, 2.14)
template<typename T, typename U>
T smallerList(T a, U b) {
std::cout << "a= " << a << " b= " << b << std::endl;
return a < b ? a : b;
}