2014-04-09 51 views
2

我需要在我的代碼如下兩個非常相似的結構:模板編程與位域

union ArrayEntry2Byte {   union ArrayEntry4Byte { 
    struct {       struct { 
    char foo : 1;     char foo : 1; 
    short bar : 15;     int bar : 31; 
    };        }; 
    short foobar;     int foobar; 
    // other code     // other code 
};        }; 

爲了增加這個代碼的可維護性和優雅,我想刪除使用模板編程的這些結構中的一種:

template<typename value_type> 
union ArrayEntry { 
    struct { 
    char foo : 1; 
    value_type bar : 15; 
    }; 
    value_type foobar; 
    // other code 
}; 

但是,位字段給我帶來了麻煩。我需要的是這樣的:

value_type bar : (value_type == short ? 15 : 31); 

但是,那顯然沒有正確的語法。我如何優雅地解決這個問題?

回答

4

這裏是一個C++ 11的解決方案:

#include <limits> 

template <typename value_type> 
union ArrayEntry { 
    struct { 
     char foo : 1; 
     value_type bar : std::numeric_limits<value_type>::digits; 
    }; 
    value_type foobar; 
    // other code 
}; 
+0

然而,這很好,我想我簡化了我的問題。想象一下,我們在union中有下面的struct:struct {char foo:1;短杆1:7; short bar2:8}''或者'struct {char foo:1; int bar1:15; int bar2:16}'。然後我不得不求助於0x499602D2的解決方案,不是嗎? – user1494080

+0

@ user1494080是的,在這種情況下,如果使用某個公式不能從'value_type'類型的位數中獲取這些幻數,則必須首選0x499602D2的解決方案。 – Constructor

+0

其實他們可以。 :)我不知所措,你的解決方案完美無缺。 – user1494080

3

創建返回正確的值的私人模板:

template<typename T> 
struct bitFieldValue : std::integral_constant<int, 31> 
{ }; 

template<> 
struct bitFieldValue<short> : std::integral_constant<int, 15> 
{ }; 

再後來就:

value_type bar : bitFieldValue<value_type>::value; 
+0

爲什麼創建一個特性,當你可以使用'std :: numeric_limits :: digits'? – rici

+0

@rici沒有意識到這一點。好的。對另一個答案+1。 – 0x499602D2

+0

這可能是一個初學者的問題,但_private_模板是什麼? – user1494080