2013-01-09 153 views
1

我有一組structs,它們來自我轉換爲C++的一些C代碼,根據我的理解,它們應該是POD類型。下面是一些例子:將結構從C轉換爲C++(POD)

struct Data { 
    u16 type : 12; 
    u8 variant : 3; 
    bool isTop : 1; 
}; 

struct DData { 
    u16 type : 12; 
    u8 variant : 3; 
    u8 layer : 1; 
}; 

struct TData { 
    struct Data data1, data2; 
    struct DData ddata[MAX]; 
    u16 x; 
    u8 y; 
    u8 s : 4; 
    u8 l : 4; 
    u8 wl : 3; 
    u8 wr : 3; 
    u8 lt : 2; 
}; 

我有很多方法,這到現在有指向這些結構作爲參數,我打算給他們直接將結構聲明中節省了大量的打字,例如。

struct Data { 
    u16 type : 12; 
    u8 variant : 3; 
    bool isTop : 1; 

    inline bool hasFlag(u64 flag) { return Types::specs[type].flags & flag; } 
}; 

我在想,如果我每次可以以這種方式添加方法是安全的這一struct,這些結構是通過網絡和成二進制文件序列化,所以我需要確保這不能突破可能任何東西。如果我是對的,他們應該保持POD類型,所以不會出現特別的問題或開銷。

回答

4

這應該仍然是POD。

您可以通過使用std::is_pod特質是肯定的:

std::is_pod<Data>::value; 

true如果Data是POD,否則爲false。

無論如何,我不會打擾將函數移動到結構體中。除了不同的調用語法之外,你沒有真正獲得任何東西。

+0

奇怪的是,沒有一個結構被'is_pod'特徵報告爲POD。我想知道爲什麼,或許與位域包裝有什麼關係?這似乎很奇怪。 – Jack

+0

@傑克它在我的gcc工作:http://stacked-crooked.com/view?id=0d31687b000ddca688e12ad6fd0eea44雖然不確定位域。 – Pubby

+0

我的意思是他們沒有被報道爲POD,即使沒有在他們內部聲明的方法,我總是認爲他們是因爲他們只是結構。 – Jack