В те дни я много читал о reinterpret_cast<>
и о том, как его следует использовать (и избегать его в большинстве случаев).
Хотя я понимаю, что использование reinterpret_cast<>
для приведения, скажем, unsigned char*
к char*
, является определенной реализацией (и, следовательно, непереносимой), кажется, нет другого способа для эффективного преобразовать одно в другое.
Допустим, я использую библиотеку, которая работает с 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);
Конечно, это очень неоптимально, и я даже не уверен, что оно более переносимо, чем первое решение.
Итак, вопрос в том, что бы вы сделали в этой ситуации, чтобы получить хорошо переносимый код?