C++标准模板(STL)- 类型支持 (类型修改,使给定的整型类型无符号,std::make_unsigned)

类型特性

类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。

试图特化定义于 <type_traits> 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。

定义于<type_traits>头文件的模板可以用不完整类型实例化,除非另外有指定,尽管通常禁止以不完整类型实例化标准库模板。
 

类型修改


类型修改模板通过应用修改到模板参数,创建新类型定义。结果类型可以通过成员 typedef type 访问。
 

使给定的整型类型无符号

std::make_unsigned

template< class T >
struct make_unsigned;

(C++11 起)

T 是整数(除 bool )或枚举类型,则提供成员 typedef type ,它是对应 T 的拥有相同 cv 限定符的无符号整数类型。对应枚举类型的无符号整数类型是拥有最小级别和与枚举相同的 sizeof 的无符号整数类型。

否则,行为未定义。

成员类型

成员定义
type对应 T 的无符号整数类型

辅助类型

template< class T >
using make_unsigned_t = typename make_unsigned<T>::type;

(C++14 起)

可能的实现

  template<typename _Tp>
    struct make_unsigned 
    { typedef typename __make_unsigned_selector<_Tp>::__type type; };

  // Integral, but don't define.
  template<>
    struct make_unsigned<bool>;

 调用示例

#include <iostream>
#include <type_traits>

int main()
{
    typedef std::make_unsigned<char>::type char_type;
    typedef std::make_unsigned<int>::type int_type;
    typedef std::make_unsigned<volatile long>::type long_type;
    typedef std::make_unsigned<long long>::type long_long_type;
    typedef std::make_unsigned<short>::type short_type;
    typedef std::make_unsigned<int8_t>::type int8_t_type;
    typedef std::make_unsigned<int16_t>::type int16_t_type;
    typedef std::make_unsigned<int32_t>::type int32_t_type;
    typedef std::make_unsigned<int64_t>::type int64_t_type;

    std::cout << std::boolalpha;
    std::cout << "std::is_same<std::make_unsigned<char>::type, unsigned char>::value:   "
              << std::is_same<char_type, unsigned char>::value << std::endl;
    std::cout << "std::is_same<std::make_unsigned<int>::type, unsigned int>::value:    "
              << std::is_same<int_type, unsigned int>::value << std::endl;
    std::cout << "std::is_same<std::make_unsigned<volatile long>::type, volatile unsigned long>::value:   "
              << std::is_same<long_type, volatile unsigned long>::value << std::endl;
    std::cout << "std::is_same<std::make_unsigned<long long>::type, unsigned long long>::value:    "
              << std::is_same<long_long_type, unsigned long long>::value << std::endl;
    std::cout << "std::is_same<std::make_unsigned<short>::type, unsigned short>::value:    "
              << std::is_same<short_type, unsigned short>::value << std::endl;
    std::cout << "std::is_same<std::make_unsigned<int8_t_type>::type, uint8_t>::value:    "
              << std::is_same<int8_t_type, uint8_t>::value << std::endl;
    std::cout << "std::is_same<std::make_unsigned<int16_t_type>::type, uint16_t>::value:    "
              << std::is_same<int16_t_type, uint16_t>::value << std::endl;
    std::cout << "std::is_same<std::make_unsigned<int32_t_type>::type, uint32_t>::value:    "
              << std::is_same<int32_t_type, uint32_t>::value << std::endl;
    std::cout << "std::is_same<std::make_unsigned<int64_t_type>::type, uint64_t>::value:    "
              << std::is_same<int64_t_type, uint64_t>::value << std::endl;

    return 0;
}

输出

std::is_same<std::make_unsigned<char>::type, unsigned char>::value:   true
std::is_same<std::make_unsigned<int>::type, unsigned int>::value:    true
std::is_same<std::make_unsigned<volatile long>::type, volatile unsigned long>::value:   true
std::is_same<std::make_unsigned<long long>::type, unsigned long long>::value:    true
std::is_same<std::make_unsigned<short>::type, unsigned short>::value:    true
std::is_same<std::make_unsigned<int8_t_type>::type, uint8_t>::value:    true
std::is_same<std::make_unsigned<int16_t_type>::type, uint16_t>::value:    true
std::is_same<std::make_unsigned<int32_t_type>::type, uint32_t>::value:    true
std::is_same<std::make_unsigned<int64_t_type>::type, uint64_t>::value:    true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值