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

Yoc*_*mer 3 c++ struct casting 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
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 10

你无法进​​行这样的演员表,这是没有意义的.你可以做的就是在地址的对象,并重新诠释的地址作为一个字节地址:

char* const buf = reinterpret_cast<char*>(&obj);
Run Code Online (Sandbox Code Playgroud)

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

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

using buffer_t = char[sizeof(Blah)];
buffer_t* pbuf = reinterpret_cast<buffer_t*>(&obj);
Run Code Online (Sandbox Code Playgroud)

但请注意,您仍在使用指向缓冲区的指针.

  • @YochaiTimmer再次,我不同意.你不是(仅)表演演员.但是,请参阅我更新的答案. (2认同)

Eri*_*hil 6

你可以这样做reinterpret_cast<char (&)[sizeof b]>(b),但我不推荐它.

  • @Yochai您似乎不知道C++是如何工作的.很多非法代码编译."按预期工作" - 可能在您的特定编译器/计算机组合上.这对于强大的软件来说还不够. (7认同)
  • @Eric:就指针*到*的引用的基本类型而言.这意味着`char(*)[N]`.并且**指针类型不允许别名任何东西.你可能会想到的是`char*`,它可以为任何东西添加别名.据我所知,你正在调用未定义的行为. (3认同)