c++ std::enable_if区分浮点数和有符号数
C++ std::enable_if differentiate between floating point and signed number?
如何区分有符号数和浮点数?
template<class T, typename std::enable_if<std::is_signed<T>::value>::type* = nullptr >
const char* GetTypeName(T t)
{
if (std::numeric_limits<T>::max() == std::numeric_limits<signed char>::max())
return "int8";
else if (std::numeric_limits<T>::max() == std::numeric_limits<signed short>::max())
return "int16";
else if (std::numeric_limits<T>::max() == std::numeric_limits<signed int>::max())
return "int32";
else if (std::numeric_limits<T>::max() == std::numeric_limits<signed long long>::max())
return "int64";
else
return nullptr;
}
template<class T, typename std::enable_if<std::is_unsigned<T>::value>::type* = nullptr >
const char* GetTypeName(T t)
{
if (std::numeric_limits<T>::max() == std::numeric_limits<unsigned char>::max())
return "uint8";
else if (std::numeric_limits<T>::max() == std::numeric_limits<unsigned short>::max())
return "uint16";
else if (std::numeric_limits<T>::max() == std::numeric_limits<unsigned int>::max())
return "uint32";
else if (std::numeric_limits<T>::max() == std::numeric_limits<unsigned long long>::max())
return "uint64";
else
return nullptr;
}
template<class T, typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr >
const char* GetTypeName(T t)
{
if (std::numeric_limits<T>::max() == std::numeric_limits<Float32>::max())
return "float";
else if (std::numeric_limits<T>::max() == std::numeric_limits<Float64>::max())
return "double";
else
return nullptr;
}
可以完美地用于整型,但不能区分有符号数和浮点数:
// Works as expected
std::string tsig = GetTypeName<signed char>(static_cast<signed char>(0));
std::string tsig = GetTypeName<signed short>(static_cast<signed short>(0));
std::string tsig = GetTypeName<signed int>(static_cast<signed int>(0));
std::string tsig = GetTypeName<signed long long>(static_cast<signed long long>(0));
// Works as expected
std::string tsig = GetTypeName<unsigned char>(static_cast<unsigned char>(0));
std::string tsig = GetTypeName<unsigned short>(static_cast<unsigned short>(0));
std::string tsig = GetTypeName<unsigned int>(static_cast<unsigned int>(0));
std::string tsig = GetTypeName<unsigned long long>(static_cast<unsigned long long>(0));
// This is ambiguous!
std::string tsig = GetTypeName<float>(static_cast<float>(0));
std::string tsig = GetTypeName<double>(static_cast<double>(0));
将std::is_floating_point
性状与std::is_signed
性状一起使用
template<class T, typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr >
const char* GetTypeName(T t)
{
// called for floating point types
}
template<class T, typename std::enable_if<std::is_signed<T>::value &&
!std::is_floating_point<T>::value>::type* = nullptr >
const char* GetTypeName(T t)
{
// called for signed integral types
}
您的示例也可以使用重载解析重新实现,这避免了所有if-else if
s和numeric_limits
的冗长。
template<typename T>
const char *GetTypeName(T) { return "<unknown>"; }
const char *GetTypeName(signed char) { return "int8"; }
const char *GetTypeName(signed short) { return "int16"; }
const char *GetTypeName(signed int) { return "int32"; }
const char *GetTypeName(signed long) { return "int64"; }
std::cout << GetTypeName(static_cast<signed char>(0)) << std::endl;
std::cout << GetTypeName(static_cast<signed short>(0)) << std::endl;
std::cout << GetTypeName(static_cast<signed int>(0)) << std::endl;
std::cout << GetTypeName(static_cast<signed long>(0)) << std::endl;
std::cout << GetTypeName(static_cast<signed long long>(0)) << std::endl;
现场演示
不幸的是,enable_if
并不容易扩展。
!std::is_floating_point<T>::value
添加到有符号和无符号积分的条件中。
在您的特殊情况下:
#include <cstdint>
char const* GetTypeName(...) { return nullptr; }
char const* GetTypeName(int8_t) { return "int8"; }
char const* GetTypeName(int16_t) { return "int16"; }
char const* GetTypeName(int32_t) { return "int32"; }
char const* GetTypeName(int64_t) { return "int64"; }
// etc...
不需要那些复杂的机器就可以工作。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 将浮点数转换为无符号字符数组并打印出来
- 将(N 个字节)无符号字符指针转换为浮点数和双 C++
- 在 SIMD 中将符号短C++转换为浮点数
- 从无符号 int 转换为浮点数时出错
- 将浮点数 32 位变量类型转换为无符号整数 32 位时进行了哪些位级更改
- 无符号短至自定义浮点数 16 位
- 将范围有限的浮点数转换为无符号的整数,以保持排序顺序和精度
- 这段代码如何找到浮点数的符号
- 将正浮点数组转换为无符号短数组,并按C++舍入
- 将有符号整数转换为二进制浮点数,比反运算成本低
- 将浮点数*或其他指针转换为无符号字符*
- Win32 API:如何使编辑文本仅在c++中接受无符号浮点数
- 从文件中读取浮点数/单词/符号,并仅将浮点数存储在数组中
- 有可能的方法可以将两个从无符号 int 铸造的浮点数除以产生负浮点数结果
- 从符号尾数和指数构造浮点数
- 将16位无符号整型数组转换为32位浮点数组