C++标准模板(STL)- 类型支持 (数值极限,is_specialized,is_signed,is_integer)

数值极限

定义于头文件 <limits>

|---------------------------------------------|---|---|
| 定义于头文件 <limits> | | |
| template< class T > class numeric_limits; |

numeric_limits 类模板提供查询各种算术类型属性的标准化方式(例如 int 类型的最大可能值是 std::numeric_limits<int>::max() )。

鉴别 std::numeric_limits 是否为该类型特化

复制代码
std::numeric_limits<T>::is_specialized

|---------------------------------------|---|-----------|
| static const bool is_specialized; | | (C++11 前) |
| static constexpr bool is_specialized; | | (C++11 起) |

std::numeric_limits<T>::is_specialized 的值对所有存在 std::numeric_limits 特化的 T 为 true 。

标准特化

|-------------------------|---------------------------------------------|
| T | std::numeric_limits<T>::is_specialized 的值 |
| /* non-specialized */ | false |
| bool | true |
| char | true |
| signed char | true |
| unsigned char | true |
| wchar_t | true |
| char8_t | true |
| char16_t | true |
| char32_t | true |
| short | true |
| unsigned short | true |
| int | true |
| unsigned int | true |
| long | true |
| unsigned long | true |
| long long | true |
| unsigned long long | true |
| float | true |
| double | true |
| long double | true |

调用示例

复制代码
#include <iostream>
#include <string>
#include <limits>

struct SName
{
};

//偏特化
struct SPartSpec
{
};

namespace std
{
template<>
struct numeric_limits<SPartSpec>
{
    static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
};
}

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::numeric_limits<bool>::is_specialized:            "
              << std::numeric_limits<bool>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<char>::is_specialized:            "
              << std::numeric_limits<char>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<signed char>::is_specialized:     "
              << std::numeric_limits<signed char>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<unsigned char>::is_specialized:   "
              << std::numeric_limits<unsigned char>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<wchar_t>::is_specialized:         "
              << std::numeric_limits<wchar_t>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<char16_t>::is_specialized:        "
              << std::numeric_limits<char16_t>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<char32_t>::is_specialized:        "
              << std::numeric_limits<char32_t>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<short>::is_specialized:           "
              << std::numeric_limits<short>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<unsigned short>::is_specialized:  "
              << std::numeric_limits<unsigned short>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<int>::is_specialized:             "
              << std::numeric_limits<int>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<unsigned int>::is_specialized:    "
              << std::numeric_limits<unsigned int>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<long>::is_specialized:            "
              << std::numeric_limits<long>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<unsigned long>::is_specialized:   "
              << std::numeric_limits<unsigned long>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<long long>::is_specialized:       "
              << std::numeric_limits<long long>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<unsigned long long>::is_specialized:"
              << std::numeric_limits<unsigned long long>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<float>::is_specialized:           "
              << std::numeric_limits<float>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<double>::is_specialized:          "
              << std::numeric_limits<double>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<long double>::is_specialized:     "
              << std::numeric_limits<long double>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<std::string>::is_specialized:     "
              << std::numeric_limits<std::string>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<SName>::is_specialized:           "
              << std::numeric_limits<SName>::is_specialized << std::endl;
    std::cout << "std::numeric_limits<SPartSpec>::is_specialized:       "
              << std::numeric_limits<SPartSpec>::is_specialized << std::endl;
    return 0;
}

输出

鉴别有符号类型

复制代码
std::numeric_limits<T>::is_signed

|----------------------------------|---|-----------|
| static const bool is_signed; | | (C++11 前) |
| static constexpr bool is_signed; | | (C++11 起) |

std::numeric_limits<T>::is_signed 的值对所有有符号算数类型 T 为 true ,而对无符号类型为 false 。此常量对所有特化有意义。

标准特化

|-------------------------|----------------------------------------|
| T | std::numeric_limits<T>::is_signed 的值 |
| /* non-specialized */ | false |
| bool | false |
| char | 实现定义 |
| signed char | true |
| unsigned char | false |
| wchar_t | 实现定义 |
| char8_t | false |
| char16_t | false |
| char32_t | false |
| short | true |
| unsigned short | false |
| int | true |
| unsigned int | false |
| long | true |
| unsigned long | false |
| long long | true |
| unsigned long long | false |
| float | true |
| double | true |
| long double | true |

调用示例

复制代码
#include <iostream>
#include <string>
#include <limits>

struct SName
{
};

//偏特化
struct SPartSpec
{
};

namespace std
{
template<>
struct numeric_limits<SPartSpec>
{
    static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
};
}

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::numeric_limits<bool>::is_signed:                 "
              << std::numeric_limits<bool>::is_signed << std::endl;
    std::cout << "std::numeric_limits<char>::is_signed:                 "
              << std::numeric_limits<char>::is_signed << std::endl;
    std::cout << "std::numeric_limits<signed char>::is_signed:          "
              << std::numeric_limits<signed char>::is_signed << std::endl;
    std::cout << "std::numeric_limits<unsigned char>::is_signed:        "
              << std::numeric_limits<unsigned char>::is_signed << std::endl;
    std::cout << "std::numeric_limits<wchar_t>::is_signed:              "
              << std::numeric_limits<wchar_t>::is_signed << std::endl;
    std::cout << "std::numeric_limits<char16_t>::is_signed:             "
              << std::numeric_limits<char16_t>::is_signed << std::endl;
    std::cout << "std::numeric_limits<char32_t>::is_signed:             "
              << std::numeric_limits<char32_t>::is_signed << std::endl;
    std::cout << "std::numeric_limits<short>::is_signed:                "
              << std::numeric_limits<short>::is_signed << std::endl;
    std::cout << "std::numeric_limits<unsigned short>::is_signed:       "
              << std::numeric_limits<unsigned short>::is_signed << std::endl;
    std::cout << "std::numeric_limits<int>::is_signed:                  "
              << std::numeric_limits<int>::is_signed << std::endl;
    std::cout << "std::numeric_limits<unsigned int>::is_signed:         "
              << std::numeric_limits<unsigned int>::is_signed << std::endl;
    std::cout << "std::numeric_limits<long>::is_signed:                 "
              << std::numeric_limits<long>::is_signed << std::endl;
    std::cout << "std::numeric_limits<unsigned long>::is_signed:        "
              << std::numeric_limits<unsigned long>::is_signed << std::endl;
    std::cout << "std::numeric_limits<long long>::is_signed:            "
              << std::numeric_limits<long long>::is_signed << std::endl;
    std::cout << "std::numeric_limits<unsigned long long>::is_signed:   "
              << std::numeric_limits<unsigned long long>::is_signed << std::endl;
    std::cout << "std::numeric_limits<float>::is_signed:                "
              << std::numeric_limits<float>::is_signed << std::endl;
    std::cout << "std::numeric_limits<double>::is_signed:               "
              << std::numeric_limits<double>::is_signed << std::endl;
    std::cout << "std::numeric_limits<long double>::is_signed:          "
              << std::numeric_limits<long double>::is_signed << std::endl;
    std::cout << "std::numeric_limits<std::string>::is_signed:          "
              << std::numeric_limits<std::string>::is_signed << std::endl;
    std::cout << "std::numeric_limits<SName>::is_signed:                "
              << std::numeric_limits<SName>::is_signed << std::endl;
    std::cout << "std::numeric_limits<SPartSpec>::is_signed:            "
              << std::numeric_limits<SPartSpec>::is_signed << std::endl;
    return 0;
}

输出

鉴别整数类型

复制代码
std::numeric_limits<T>::is_integer

|-----------------------------------|---|-----------|
| static const bool is_integer; | | (C++11 前) |
| static constexpr bool is_integer; | | (C++11 起) |

标准特化

|-------------------------|-----------------------------------------|
| T | std::numeric_limits<T>::is_integer 的值 |
| /* non-specialized */ | false |
| bool | true |
| char | true |
| signed char | true |
| unsigned char | true |
| wchar_t | true |
| char8_t | true |
| char16_t | true |
| char32_t | true |
| short | true |
| unsigned short | true |
| int | true |
| unsigned int | true |
| long | true |
| unsigned long | true |
| long long | true |
| unsigned long long | true |
| float | false |
| double | false |
| long double | false |

调用示例

复制代码
#include <iostream>
#include <string>
#include <limits>

struct SName
{
};

//偏特化
struct SPartSpec
{
};

namespace std
{
template<>
struct numeric_limits<SPartSpec>
{
    static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_signed = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
};
}

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::numeric_limits<bool>::is_integer:                 "
              << std::numeric_limits<bool>::is_integer << std::endl;
    std::cout << "std::numeric_limits<char>::is_integer:                 "
              << std::numeric_limits<char>::is_integer << std::endl;
    std::cout << "std::numeric_limits<signed char>::is_integer:          "
              << std::numeric_limits<signed char>::is_integer << std::endl;
    std::cout << "std::numeric_limits<unsigned char>::is_integer:        "
              << std::numeric_limits<unsigned char>::is_integer << std::endl;
    std::cout << "std::numeric_limits<wchar_t>::is_integer:              "
              << std::numeric_limits<wchar_t>::is_integer << std::endl;
    std::cout << "std::numeric_limits<char16_t>::is_integer:             "
              << std::numeric_limits<char16_t>::is_integer << std::endl;
    std::cout << "std::numeric_limits<char32_t>::is_integer:             "
              << std::numeric_limits<char32_t>::is_integer << std::endl;
    std::cout << "std::numeric_limits<short>::is_integer:                "
              << std::numeric_limits<short>::is_integer << std::endl;
    std::cout << "std::numeric_limits<unsigned short>::is_integer:       "
              << std::numeric_limits<unsigned short>::is_integer << std::endl;
    std::cout << "std::numeric_limits<int>::is_integer:                  "
              << std::numeric_limits<int>::is_integer << std::endl;
    std::cout << "std::numeric_limits<unsigned int>::is_integer:         "
              << std::numeric_limits<unsigned int>::is_integer << std::endl;
    std::cout << "std::numeric_limits<long>::is_integer:                 "
              << std::numeric_limits<long>::is_integer << std::endl;
    std::cout << "std::numeric_limits<unsigned long>::is_integer:        "
              << std::numeric_limits<unsigned long>::is_integer << std::endl;
    std::cout << "std::numeric_limits<long long>::is_integer:            "
              << std::numeric_limits<long long>::is_integer << std::endl;
    std::cout << "std::numeric_limits<unsigned long long>::is_integer:   "
              << std::numeric_limits<unsigned long long>::is_integer << std::endl;
    std::cout << "std::numeric_limits<float>::is_integer:                "
              << std::numeric_limits<float>::is_integer << std::endl;
    std::cout << "std::numeric_limits<double>::is_integer:               "
              << std::numeric_limits<double>::is_integer << std::endl;
    std::cout << "std::numeric_limits<long double>::is_integer:          "
              << std::numeric_limits<long double>::is_integer << std::endl;
    std::cout << "std::numeric_limits<std::string>::is_integer:          "
              << std::numeric_limits<std::string>::is_integer << std::endl;
    std::cout << "std::numeric_limits<SName>::is_integer:                "
              << std::numeric_limits<SName>::is_integer << std::endl;
    std::cout << "std::numeric_limits<SPartSpec>::is_integer:            "
              << std::numeric_limits<SPartSpec>::is_integer << std::endl;
    return 0;
}

输出

复制代码
std::numeric_limits<bool>::is_integer:                 true
std::numeric_limits<char>::is_integer:                 true
std::numeric_limits<signed char>::is_integer:          true
std::numeric_limits<unsigned char>::is_integer:        true
std::numeric_limits<wchar_t>::is_integer:              true
std::numeric_limits<char16_t>::is_integer:             true
std::numeric_limits<char32_t>::is_integer:             true
std::numeric_limits<short>::is_integer:                true
std::numeric_limits<unsigned short>::is_integer:       true
std::numeric_limits<int>::is_integer:                  true
std::numeric_limits<unsigned int>::is_integer:         true
std::numeric_limits<long>::is_integer:                 true
std::numeric_limits<unsigned long>::is_integer:        true
std::numeric_limits<long long>::is_integer:            true
std::numeric_limits<unsigned long long>::is_integer:   true
std::numeric_limits<float>::is_integer:                false
std::numeric_limits<double>::is_integer:               false
std::numeric_limits<long double>::is_integer:          false
std::numeric_limits<std::string>::is_integer:          false
std::numeric_limits<SName>::is_integer:                false
std::numeric_limits<SPartSpec>::is_integer:            true
相关推荐
·薯条大王2 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
hansang_IR7 小时前
【题解】LC:倍增 / 区间并查集(Range Parallel Unionfind)
c++·算法·并查集
东东最爱敲键盘7 小时前
day7.c++继承
c++
沫璃染墨8 小时前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++
吃着火锅x唱着歌8 小时前
Effective C++ 学习笔记 条款40 明智而审慎地使用多重继承
c++·笔记·学习
醉城夜风~8 小时前
(超详细)C++ STL list容器详解:从使用方法到双向链表底层原理全面解析
c++·windows
烟花落o9 小时前
C++ 从 C 到进阶 ②:引用、inline 、nullptr
c++·引用·inline·nullptr·c++入门
liulilittle9 小时前
MOE路由:路由(logits: top-k/8)
c++·人工智能·算法·机器学习·llm
旖旎夜光9 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针
我不会插花弄玉11 小时前
15.map,set下:AVL树,红黑树和map,set的封装【由浅入深-C++】
c++·stl