根据这个问题: Calling template function without <>; type inference 我将在未来使用的圆函数现在看起来像:
template < typename TOut, typename TIn >
TOut roundTo( TIn value ) {
return static_cast<TOut>( value + 0.5 );
}
double d = 1.54;
int i = rountTo<int>(d);
然而,只有当它用于舍入到整数数据类型时才有意义,例如char,short,int,long,long long int,以及它是无符号的对应项。 如果它将用于TOut As float或long double,它将提供s ***。
double d = 1.54;
float f = roundTo<float>(d);
// aarrrgh now float is 2.04;
我在考虑函数的指定重载但是......
这是不可能的......
你怎么解决这个问题?
非常感谢提前
糟糕
答案 0 :(得分:1)
假设您想要最接近的整数值,请转换为TOut
,
static_cast<TOut>( static_cast<long long>(value + 0.5) );
floor
也应该作为内部演员的替代品。关键是不要依赖于强制转换为未知类型来执行任何截断 - 确保明确截断,使用floor
或cast
到一个众所周知的整数类型,然后执行返回指定类型所需的进一步投射。
答案 1 :(得分:0)
尝试使用地板:
template < typename TOut, typename TIn >
TOut roundTo( TIn value ) {
return static_cast<TOut>(floor( value + 0.5 ));
}
double d = 1.54;
int i = rountTo<int>(d);
double d = 1.54;
float f = roundTo<float>(d);
答案 2 :(得分:0)
您可以为非整数返回类型禁用您的函数:
#include <boost/type_traits.hpp>
#include <boost/utility.hpp>
template < typename TOut, typename TIn >
typename boost::enable_if<boost::is_integral<TOut>, TOut>::type roundTo( TIn value ) {
return static_cast<TOut>( value + 0.5 );
}