我有一个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
答案 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);
这将允许您明确地查看正在进行的操作并集中代码,以备日后需要更改时使用。
编辑:在我的示例中,序列化界面不是很优雅(或非常安全),但我的观点是你应该将它添加为方法。