是否可以以一种总是占用已定义类型大小的一半的方式定义类型?
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;
答案 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>;
当然,您可以使用更复杂的数学表达式来处理特殊情况(例如myType
为std::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;