基于有符号约束区分专业结构

时间:2017-02-19 21:24:48

标签: c++ c++11 templates alias template-specialization

我需要能够区分具有相同大小但不同的signed-ness属性的数据类型。下面是一个例子,

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

由于第一个特化使用unsigned char,并且有符号和无符号字符使用相同的大小,alias<1>::Type结果返回unsigned char。但我希望能够返回与有符号和无符号相同的数据类型。

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

修改

部分完整代码

#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;

2 个答案:

答案 0 :(得分:1)

这就是我所做的。

enum Sign {
  SIGNED,
  UNSIGNED
};

template <size_t SIZE, Sign SIGN>
struct Alias;

template <>
struct Alias<1, SIGNED> {
  using type = int8_t;
};
//etc

答案 1 :(得分:0)

我不明白你想要什么。

但我想你必须以某种方式明确表示你想要一个有符号的类型或一个无符号的类型。

我提出了以下方法,基于几种不同的类型和明确的选择

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;