什么类型的转换适合从 unsigned char* 转换为 char*?

Zeb*_*ish 2 c++ casting char unsigned-char

当我将数据写入缓冲区或从缓冲区写入数据以保存到文件时,我倾向于使用std::vector<unsigned char>,并且我将这些无符号字符视为要写入任何内容的字节,因此:

int sizeoffile = 16;
std::vector<unsigned char> buffer(sizeoffile);

std::ifstream inFile("somefile", std::ios::binary | std::ios::in);
inFile.read(buffer.data(), sizeoffile); // Argument of type unsigned char* is incompatible
                                        // with parameter of type char*
Run Code Online (Sandbox Code Playgroud)

的第一个参数ifstream::read()想要一个char指针,但我的向量缓冲区是unsigned char. 什么样的类型转换适合在这里将数据读入我的缓冲区?它本质上是一个char*to unsigned char*。我可以使用 reinterpret_cast 或 C 风格的转换,但这让我觉得我做错了什么,因为这些根本不经常被推荐。我是否为缓冲区选择了错误的数据类型(无符号字符)?

Ben*_*igt 6

最安全的做法是不直接使用强制转换,而是使用辅助模板,该模板将自身限制为在具有兼容表示的类型之间进行强制转换。

template<typename T, typename U>
treat_as(U* ptr) -> enable_if_t< is_same_type_v< remove_unsigned<T>, remove_unsigned<U> >, T >*
{ return reinterpret_cast<T*>(ptr); }
Run Code Online (Sandbox Code Playgroud)

进而

inFile.read(treat_as<char>(&buffer[0]), sizeoffile); 
Run Code Online (Sandbox Code Playgroud)

如果有一天向量类型更改为unsigned wchar_t,则此调用将失败,而 areinterpret_cast将默默地开始做错误的事情。