【问题标题】:Determine what the type of typedef is确定 typedef 的类型是什么
【发布时间】:2014-09-07 23:01:26
【问题描述】:

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

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

我找到了this 的答案,但我认为这不是我要找的。​​p>

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

在代码中:

typedef float FT;

// in another file
//if FT is int
int inf = INT_MAX;

...

//if FT is float
float inf = FLOAT_MAX;

但是,这仍然不是很好,因为我想将它作为参数传递给函数。首先想到的问题是函数的签名是什么。

[编辑]

签名可以使用 typedef。

【问题讨论】:

  • “在运行时”没有意义。我认为您的意思是“在编译时”(而不是“在预处理时”)。

标签: c++ c++11 typedef


【解决方案1】:

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

【讨论】:

  • 或者只是typedef std::numeric_limits&lt;float&gt; NL
【解决方案2】:

您可以在运行时使用typeid 运算符查询类型。但是,这并不能解决您的问题。如果您想要的只是一个类型可以容纳的最大正数,请使用std::numeric_limits&lt;FT&gt;::max()。请注意,还有std::numeric_limits&lt;FT&gt;::has_quiet_NaN()。这些是编译时的constexpressions,这就是它们真正有用的原因。

【讨论】:

  • 谢谢,我将接受另一个答案,因为它是第一位的。 :)
【解决方案3】:

使用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&lt;T&gt;::infinity

【讨论】:

  • 谢谢,我会接受第一个答案,因为它来了......首先。 ;p
猜你喜欢
  • 1970-01-01
  • 2012-01-01
  • 2011-03-28
  • 1970-01-01
  • 2017-02-15
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多