如何定义相对于其他类型大小的类型?

时间:2016-11-29 16:52:40

标签: c++ types typedef

是否可以以一种总是占用已定义类型大小的一半的方式定义类型?

typedef int16_t myType;
typedef int8_t myTypeHalf;

所以当我决定将 myType int16_t 更改为 int32_t myTypeHalf 会自动更改为 int16_t ,因此我不需要担心我可能忘记更改 myTypeHalf

typedef int32_t myType;
typedef int16_t myTypeHalf;

2 个答案:

答案 0 :(得分:7)

您可以定义一组模板专精,如下所示:

template<size_t Bits> struct SizedInt;
template<> struct SizedInt<8> { using type = std::int8_t; };    
template<> struct SizedInt<16>{ using type = std::int16_t; };
template<> struct SizedInt<32>{ using type = std::int32_t; };
template<> struct SizedInt<64>{ using type = std::int64_t; };

template<size_t Bits>
using SizedInt_t = typename SizedInt<Bits>::type;

然后你可以像这样定义你的类型:

using myType = std::int32_t;
using myTypeHalf = SizedInt_t<sizeof(myType) * 4>;

当然,您可以使用更复杂的数学表达式来处理特殊情况(例如myTypestd::int8_t时),但我认为这可以解决这个问题。

答案 1 :(得分:2)

尝试类似:

template<typename T>
struct HalfType
{
    typedef int8_t Type;
};

以及一系列专业化,例如:

template<>
struct HalfType<int32_t>
{
    typedef int16_t Type;
};

..............

可能的案件数量并不大。您可以简单地指定它们。一旦传递的类型没有hallf类型,默认模板将给出int8_t。使用应该看起来像

HalfType<somePassedType>::Type myVarOfHalfTheSize;