如何将结构转换为char []数组?

时间:2013-03-19 16:25:54

标签: c++ casting struct bytearray

我有一个Blah类型的变量。

我想将其投放到char[sizeof(blah)],而不进行复制 我需要强制类型转换为足以实例化期望char[N]的模板。

我尝试了很多东西,但我不太明白 我想要这样的东西正常工作:

class Blah {
 int a;   
};


template <typename T>
void foo (T& a) 
{ 
    //Not an array
}

template <int N>
void foo (char(&a)[N]) 
{ 
    //an array!
}

Blah b;
foo(b); //not an array
foo((char[sizeofBlah])b); //hopefully treated as an array

3 个答案:

答案 0 :(得分:9)

你无法执行这样的演员表,这是没有意义的。您可以做的是获取对象的地址并将地址重新解释为字节地址:

char* const buf = reinterpret_cast<char*>(&obj);

这应该满足您的要求,但要注意使用术语“强制转换为char[]”,因为它会混淆正在发生的实际操作。

您还可以将地址解释为固定大小缓冲区的起始地址,当然:

using buffer_t = char[sizeof(Blah)];
buffer_t* pbuf = reinterpret_cast<buffer_t*>(&obj);

但请注意,你仍然在这里使用指针到缓冲区。

答案 1 :(得分:6)

您可以使用reinterpret_cast<char (&)[sizeof b]>(b)执行此操作,但我不建议这样做。

答案 2 :(得分:1)

最干净的方法是将它作为一个操作添加到类中:

class Blah {
    int a;
public:
    void serialize(char *output) { output[0] = a; /* add others as needed */ }
};

Blah blah;
char buffer[sizeof(Blah)];
blah.serialize(buffer);

这将允许您明确地查看正在进行的操作并集中代码,以备日后需要更改时使用。

编辑:在我的示例中,序列化界面不是很优雅(或非常安全),但我的观点是你应该将它添加为方法。