3

我有一个类型的变量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
4

3 回答 3

10

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

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

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

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

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

但请注意,您仍然在此处使用指向缓冲区的指针。

于 2013-03-19T16:28:05.803 回答
6

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

于 2013-03-19T16:42:26.417 回答
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);

这将允许您明确地查看正在发生的事情并集中代码,以防您以后需要更改它。

编辑:在我的示例中,序列化接口不是很优雅(或很安全),但我的观点是您应该将其添加为方法。

于 2013-03-19T16:37:41.577 回答