我想用积极无限的东西。但是,我的代码使用的数据类型是由其他人的类进行typedef。这意味着它可以是int,float,double和几乎是数字类型。
以前当我使用无穷大时,对于整数我会像INT_MAX
那样,等等。但是,我可以确定(在编译)我正在使用的类型吗?
我找到了this回答,但我认为这不是我想要的。
但另一方面,我想不出一种优雅的方法来实现这一目标。
在代码中:
typedef float FT;
// in another file
//if FT is int
int inf = INT_MAX;
...
//if FT is float
float inf = FLOAT_MAX;
但是,这仍然不太好,因为我想将它作为参数传递给函数。这个功能的签名是第一个浮现在脑海中的问题。
[编辑]
签名可以使用typedef。
答案 0 :(得分:5)
也许你可以查看numeric_limits<T>
。
// numeric_limits example
#include <iostream> // std::cout
#include <limits> // std::numeric_limits
typedef float FT;
int main () {
std::cout << std::boolalpha;
std::cout << "Minimum value for FT: " << std::numeric_limits<FT>::min() << '\n';
std::cout << "Maximum value for FT: " << std::numeric_limits<FT>::max() << '\n';
std::cout << "FT is signed: " << std::numeric_limits<FT>::is_signed << '\n';
std::cout << "Non-sign bits in FT: " << std::numeric_limits<FT>::digits << '\n';
std::cout << "FT has infinity: " << std::numeric_limits<FT>::has_infinity << '\n';
return 0;
}
使用typedef float FT;
Minimum value for FT: 1.17549e-38
Maximum value for FT: 3.40282e+38
FT is signed: true
Non-sign bits in FT: 24
FT has infinity: true
使用typedef int FT;
Minimum value for FT: -2147483648
Maximum value for FT: 2147483647
FT is signed: true
Non-sign bits in FT: 31
FT has infinity: false
答案 1 :(得分:3)
您可以使用typeid
运算符在运行时查询类型。但是,这不会解决您的问题。如果您想要的只是一个类型可以容纳的最正数,请使用std::numeric_limits<FT>::max()
。请注意,还有std::numeric_limits<FT>::has_quiet_NaN()
。这些是编译时constexpr
次会议,这使他们真正有用。
答案 2 :(得分:2)
#include <limits>
#include <type_traits>
template <typename T, typename enable_if_helper = void>
struct get_infinity_helper;
template <typename T>
struct get_infinity_helper<T, typename std::enable_if<std::numeric_limits<T>::has_infinity>::type>
{
static constexpr T infinity = std::numeric_limits<T>::infinity();
};
template <typename T>
struct get_infinity_helper<T, typename std::enable_if<!std::numeric_limits<T>::has_infinity>::type>
{
static constexpr T infinity = std::numeric_limits<T>::max();
};
然后使用get_infinity_helper<T>::infinity
。