确定typedef的类型

时间:2014-09-07 23:01:26

标签: c++ c++11 typedef

我想用积极无限的东西。但是,我的代码使用的数据类型是由其他人的类进行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。

3 个答案:

答案 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)

使用std::numeric_limits

#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