确定typedef的类型
Determine what the type of typedef is
我想用一些东西来表示正无穷大。然而,我的代码使用的数据类型是由其他人的类定义的。这意味着它可以是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
。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 从 Typedef 数据类型中删除常量
- 使用智能指针指向 C 库中的结构,该结构通过 typedef 隐藏实现(即不完整的类型)
- 是否可以分别专注于 typedef 及其基础类型?
- 如何对绑定的成员方法进行typedef,然后将该类型用作模板参数
- 显式调用 typedef'd 类类型的析构函数的正式正确方法
- "typedef"类型名称是否可以像"struct"定义那样声明指向结构的指针?
- 具有未声明/未定义类型的 typedef 结构
- 使用 pybind11 绑定 typedef 类型的正确语法是什么?
- 通过 typedef 模板<类型名 T、T> 强制模板实例化 - 为什么有效?
- C和C 类型(TypeDEF)之间的差异
- 如何通过从变量中获取类型来访问内部 typedef
- C 通过Typedef定义新类型
- 使用#Define和Typedef与数据类型A一起使用
- typedef 类型不匹配,将其传递到函数中
- 如何使用函数签名的 typedef 作为 std::function 的类型参数
- 从 csv 文件中获取不同类型的数据,并将其放入 C++ 中的 typedef 结构中
- typedef 中的自定义类型为 Qt MetaType
- Swig 简单类型 typedef 参数