2013-01-09 54 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