整数加倍转换

时间:2014-09-08 11:31:44

标签: c++ templates integer double

如何将整数转换为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;
}

3 个答案:

答案 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中,您可以将跟踪返回类型与decltypestd::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)