确定typedef的类型

Determine what the type of typedef is

本文关键字:类型 typedef 确定      更新时间:2023-10-16

我想用一些东西来表示正无穷大。然而,我的代码使用的数据类型是由其他人的类定义的。这意味着它可以是int、float、double和几乎所有的数字类型。

以前当我使用无穷大时,我会用INT_MAX来表示整数等等。但是,我能确定(在编译时)我使用的类型吗?

我找到了这个答案,但我不认为这是我想要的。

但另一方面,我想不出一种优雅的方法来实现这一点。

代码中:

typedef float FT;
// in another file
//if FT is int
int inf = INT_MAX;
...
//if FT is float
float inf = FLOAT_MAX;

但是,这还是不太好,因为我想把它作为一个参数传递给一个函数。首先想到的问题是函数的签名是什么。

[编辑]

签名可以使用typedef。

也许您可以查看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

您可以在运行时使用typeid运算符查询类型。然而,这并不能解决你的问题。如果您只想要一个类型所能容纳的最正数,请使用std::numeric_limits<FT>::max()。注意,还有std::numeric_limits<FT>::has_quiet_NaN()。这些是编译时的constexpr会话,这使它们真正有用。

使用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