C++ 对整数类型执行舍入,但不对小数类型执行舍入
在下面的函数中,我正在寻找一个表达式来替换C++ 对整数类型执行舍入,但不对小数类型执行舍入,c++,templates,types,C++,Templates,Types,在下面的函数中,我正在寻找一个表达式来替换isIntegral 其目的是,当T是整数类型时,我们在static_-cast之前添加0.5f隐式地降低值(因此我们获得一个舍入值),但当T是分数类型时,我们不添加任何内容,因此static_-cast只能降低精度 T interpolate( T const & prev, T const & next, float interpolation ) { float prevFloat = static_cast< flo
isIntegral
其目的是,当T
是整数类型时,我们在static_-cast
之前添加0.5f
隐式地降低值(因此我们获得一个舍入值),但当T
是分数类型时,我们不添加任何内容,因此static_-cast
只能降低精度
T interpolate( T const & prev, T const & next, float interpolation )
{
float prevFloat = static_cast< float >( prev );
float nextFloat = static_cast< float >( next );
float result = prevFloat + ( (nextFloat-prevFloat) * interpolation );
return static_cast< T >( result + ( isIntegral<T> ? 0.5f : 0.0f );
}
T插值(T常量和上一个、T常量和下一个、浮点插值)
{
float-prevFloat=静态施法(prev);
float nextFloat=静态_cast(下一步);
浮点结果=prevFloat+((nextFloat prevFloat)*插值);
返回静态(结果+(isIntegral?0.5f:0.0f);
}
使用std::numeric\u limits::is\u integer
(它在标题中)。使用std::numeric\u limits::is\u integer
(它在标题中)。std::is\u integral::value
如果包含
,大多数编译器现在都支持此功能。std::is_integral::value
如果包含
,大多数编译器现在都支持这一点。这应该是可能的(没有任何运行时开销),但需要一些Boost魔法(未测试):
#包括
#包括
样板
typename boost::enable_if::type
插值(常量T和上一个、常量T和下一个、浮点插值){
//T为整型情况的代码
}
样板
typename boost::禁用_if::type
插值(常量T和上一个、常量T和下一个、浮点插值){
//T不是整型的情况下的代码
}
这应该是可能的(没有任何运行时开销),使用一些Boost magic(未测试):
#包括
#包括
样板
typename boost::enable_if::type
插值(常量T和上一个、常量T和下一个、浮点插值){
//T为整型情况的代码
}
样板
typename boost::禁用_if::type
插值(常量T和上一个、常量T和下一个、浮点插值){
//T不是整型的情况下的代码
}
为什么不直接声明常量浮点加数=0.5f-静态转换(0.5f)
为什么不直接声明常量浮点加数=0.5f-静态转换(0.5f)
在实践中,编译器应该优化三元表达式(在OP的代码中)通过常数折叠实现零。正确,如果这里的开销可能很大,则使用enable\u。但是,如果不同类型的代码有很大差异,则该方法非常有用。在实践中,编译器应优化三元表达式(在OP的代码中)通过常量折叠实现零。正确,如果此处可能会出现开销,则使用enable_。但是,如果不同类型的代码有很大差异,则此功能非常有用。
std::is_integral<T>::value
#include <boost/type_traits/is_integral.hpp>
#include <boost/utility/enable_if.hpp>
template<typename T>
typename boost::enable_if<boost::is_integral<T>, T>::type
interpolate(const T& prev, const T& next, float interpolation) {
// code for the case that T is an integral type
}
template<typename T>
typename boost::disable_if<boost::is_integral<T>, T>::type
interpolate(const T& prev, const T& next, float interpolation) {
// code for the case that T is not an integral type
}