基于签名性区分专业结构

Differentiating Specialized Structs based on signed-ness

本文关键字:结构 于签名 性区      更新时间:2023-10-16

我需要能够区分具有相同大小但签名属性不同的数据类型。一个例子如下,

template <size_t N>
struct alias;
template<>
struct alias<sizeof(unsigned char)>{
    using Type = unsigned char;
};
template<>
struct alias<sizeof(signed char)>{
    using Type = signed char;
};
using uint8 = alias<1>::Type;
using int8 = alias<1>::Type;  //This is supposed to be signed type

由于第一次专业化使用了无符号字符,并且签名和未签名的炭都使用相同的大小,因此 alias<1>::Type结果返回无符号char。但是我希望能够返回与签名和未签名的相同数据类型。

我也知道有std :: is_signed或std :: is_unsign在type_traits header文件下。在这种情况下,我无法弄清楚如何使用它们。

编辑

部分完整代码

#define BYTE 1
template <size_t N>
struct alias;
#define REGISTER_ALIAS(X)           
template <>                         
struct alias <sizeof(X)> {          
           using Type = X;          
};
REGISTER_ALIAS(unsigned char)
REGISTER_ALIAS(signed char)
using int8 = alias<BYTE>::Type;
using uint8 = alias<BYTE>::Type;

这就是我所做的。

enum Sign {
  SIGNED,
  UNSIGNED
};
template <size_t SIZE, Sign SIGN>
struct Alias;
template <>
struct Alias<1, SIGNED> {
  using type = int8_t;
};
//etc

我不明白你想要什么。

,但我想您必须以某种方式表明您想要签名类型或无符号类型。

我根据几个不同类型和明确的选择提出以下方式

template <size_t N>
struct alias;
template<>
struct alias<sizeof(char)>{
    using sType = signed char;
    using uType = unsigned char;
};
using uint8 = alias<1>::uType;
using int8 = alias<1>::sType;