区分模板中的整数和浮点类型
Distinguishing integer from floating point types in a template
我想对几种整数类型(16、32、64 位)和浮点类型(浮点数、双精度数、长双精度数)执行类似但不相同的计算。大多数代码是相同的,但对于整数和浮点数,某些部分需要以不同的方式完成。例如,比较整数可以用 a==b 来完成,而比较浮点数应该用 abs(a-b) 来完成
一种方法是将整数和浮点数之间不同的代码部分隔离为小函数,并为每种类型专门化模板。但是,我宁愿不为每个整数类型复制粘贴相同的代码,不为每个浮点类型复制粘贴另一个代码。因此问题来了:是否可以同时将模板功能专门化为多种类型?语义类似于以下内容的东西,如果它是合法的:
template<>
bool isEqual< short OR long OR long long >( T a, T b ) {
return a == b;
}
template<>
bool isEqual< float OR double OR long double >( T a, T b ) {
return abs( a - b ) < epsilon;
}
使用 C++11 可以使用类型特征。请参阅std::enable_if
文档在您的情况下,它可能如下所示:
函数参数专用化:
template<class T>
bool isEqual(T a, T b, typename std::enable_if<std::is_integral<T>::value >::type* = 0)
{
return a == b;
}
template<class T>
bool isEqual(T a, T b, typename std::enable_if<std::is_floating_point<T>::value >::type* = 0)
{
return abs( a - b ) < epsilon;
}
返回类型专用化:
template<class T>
typename std::enable_if<std::is_integral<T>::value, bool >::type isEqual(T a, T b)
{
return a == b;
}
template<class T>
typename std::enable_if<std::is_floating_point<T>::value, bool >::type isEqual(T a, T b)
{
return abs( a - b ) < epsilon;
}
是的,您可以将 SFINAE 与 <type_traits>
中的元函数结合使用
#include<type_traits>
template<class IntegralType>
typename std::enable_if<
std::is_integral<IntegralType>::value,
bool>::type
isEqual(IntegralType a,IntegralType b)
{
return a == b;
}
template<class FloatingType>
typename std::enable_if<
std::is_floating_point<FloatingType>::value,
bool>::type
isEqual(FloatingType a,FloatingType b)
{
return fabs(a-b) < std::numeric_limits<FloatingType>::epsilon();
}
你可以专注于<type_traits>
然后,您可以根据类别对功能进行分组
template<typename T, bool INTEGRAL> class isEqualbyType;
template<typename T>
class isEqualbyType<T, true>
{
public:
static bool cmp( T a, T b ) {
return a == b; }
};
template<typename T>
class isEqualbyType<T, false>
{
public:
static bool cmp( T a, T b ) {
static const double epsilon=1e-50;
return abs( a - b ) < epsilon; }
};
template<typename T>
bool isEqual( T a, T b )
{
return isEqualbyType<T, std::is_integral<T>::value>::cmp(a,b);
};
相关文章:
- 将超出范围的整数分配给有符号字符类型
- 当我输入字符类型的数字时,为什么我无法获得整数?
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 在 c++ 中,能够将浮点类型加 1 的最大整数是多少?
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 比较两个整数在C++中与未知 int 类型的相等性
- 如何在不给它任何类型(如整数)的情况下定义某物?
- 通过编译时值推断整数的类型
- C++/错误:表达式必须具有整数或无作用域枚举类型
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- 有没有办法将字符类型转换为整数?
- C++,概念不适用于无符号整数作为结果类型?
- 如何将整数分配给 char 类型的变量
- 类型转换问题:返回为整数而不是浮点/类型
- 涉及旧式枚举和整数类型的重载解析
- 将字符串转换为整数类型T,检查是否存在溢出
- 如何判断 c++ 向量中的值类型(整数或双精度)?
- 在 C/C++ 中,混合类型整数数学所需的最小类型向上转换是多少?
- 如何将字节数组转换为整数类型(整数、长整型、短型等)"安眠安"?
- 我可以在C++中制作一个强类型整数吗?