2016-11-29 49 views
2

是否可以定義一個類型,它總是會佔用已定義類型大小的一半?如何定義相對於其他類型大小的類型?

typedef int16_t myType; 
typedef int8_t myTypeHalf; 

所以,當我決定從改變的myType int16_tint32_tmyTypeHalf將自動更改爲int16_t,所以我不會」不用擔心我可能會忘記更換myTypeHalf

typedef int32_t myType; 
typedef int16_t myTypeHalf; 
+1

而如果'myType'是'int8_t'? – YSC

+0

然後'myTypeHalf',也需要是'int8_t',但問題更多的是是否可以定義這樣的條件/依賴關係。或者是在評論中提及它的唯一方法,並希望後面的任何人使用代碼來處理評論指示? – Riko

回答

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),但我認爲這可以讓人想到。

+0

這看起來更靈活,因爲它使用大小而不是類型。現在你不需要擔心無符號類型。 +1 – NathanOliver

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; 
相關問題