如何将整数转换为double?我有这个代码,它的结果是15
,而不是15.45
那是因为程序将第一个数字作为结果的类型,在这个程序中是整数
#include <iostream>
using namespace std;
template < class T1 , class T2 >
T1 smaller ( T1 a, T2 b ){
return (a<b?a:b);
}
int main(){
int x = 98;
double y = 15.45;
cout << smaller( x , y ) << endl;
return 0;
}
答案 0 :(得分:2)
这是因为你的返回类型是模板化的第一个输入参数的类型,在这种情况下是整数。
输入和输出应该具有相同的类型,并明确选择要在函数中使用的类型。例如:
template < class T >
T smaller ( T a, T b ){
return (a<b?a:b);
}
int main {
int x = 98;
double y = 15.45;
// cout << smaller( x , y ) << endl; //This wouldn't compile. It would compile if x and y had the same type.
// cout << smaller<int>( x , y ) << endl; //This would still return 15
cout << smaller<double>( x , y ) << endl;
}
正如user2079303所提到的,您尝试实现的功能与标准库中可用的std :: min功能非常相似。
答案 1 :(得分:2)
在C ++ 11中,您可以将跟踪返回类型与decltype
和std::decay
(或者std::common_type
)一起使用:
template < class T1 , class T2 >
auto smaller ( T1 a, T2 b ) -> typename std::decay<decltype(a<b?a:b)>::type {
return (a<b?a:b);
}
decay
是确保函数按值返回所必需的。由于您按值获取参数,因此无法返回引用。
在C ++ 14中,您可以使用返回类型推导:
template < class T1 , class T2 >
auto smaller ( T1 a, T2 b ) {
return (a<b?a:b);
}
Pre-C ++ 11,您可以编写一个具有大量特殊化的大型复杂promotion_traits
类来确定适当的返回类型并返回typename promotion_traits<T1, T2>::type
,或者您可以执行Antonio建议和模板{相反,在一个模板参数上{1}},在这种情况下,它变为smaller
但是传递值而不是const引用。
答案 2 :(得分:0)
在函数调用中,尝试将x转换为double。
(double)x //or
static_cast<double>(x)