那些天我一直在阅读很多reinterpret_cast<>
关于应该如何使用它的文章(并且在大多数情况下避免使用它)。
虽然我知道使用reinterpret_cast<>
to cast from,say unsigned char*
tochar*
是实现定义的(因此是不可移植的),但似乎没有其他方法可以有效地将一个转换为另一个。
假设我使用一个unsigned char*
处理一些计算的库。在内部,我已经用它char*
来存储我的数据(而且我无法更改它,因为如果我这样做会杀死小狗)。
我会做类似的事情:
char* mydata = getMyDataSomewhere();
size_t mydatalen = getMyDataLength();
// We use it here
// processData() takes a unsigned char*
void processData(reinterpret_cast<unsigned char*>(mydata), mydatalen);
// I could have done this:
void processData((unsigned char*)mydata, mydatalen);
// But it would have resulted in a similar call I guess ?
如果我希望我的代码具有高度可移植性,我似乎别无选择,只能先复制我的数据。就像是:
char* mydata = getMyDataSomewhere();
size_t mydatalen = getMyDataLength();
unsigned char* mydata_copy = new unsigned char[mydatalen];
for (size_t i = 0; i < mydatalen; ++i)
mydata_copy[i] = static_cast<unsigned char>(mydata[i]);
void processData(mydata_copy, mydatalen);
当然,这是非常不理想的,我什至不确定它是否比第一个解决方案更便携。
所以问题是,在这种情况下你会怎么做才能拥有高度可移植的代码?