我有一个const uint8_t*我想要转换为一个char*期望a的接口char*.
最简单的方法是使用C风格的强制转换:
const uint8_t* aptr = &some_buffer;
char* bptr = (char*)aptr;
Run Code Online (Sandbox Code Playgroud)
但是,我们的内部样式指南(基于Google C++样式指南)禁止C样式转换.
另一种选择是这种怪异,我发现这是非常难以理解的:
char *cptr = reinterpret_cast<char*>(const_cast<uint8_t*>(aptr));
Run Code Online (Sandbox Code Playgroud)
我尝试的其他选项都无法编译:
char* dptr = reinterpret_cast<char*>(aptr);
char* eptr = const_cast<char*>(aptr);
char* fptr = static_cast<char*>(aptr);
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以使用C++样式转换来执行此转换而不嵌套两个单独的转换操作?
有没有什么方法可以使用C++样式转换来执行此转换而不嵌套两个单独的转换操作?
不便携,没有.没有单一的"类型是错的,而const也是错误的"演员.
另一种选择是这种怪异,我发现这是非常难以理解的:
char *cptr = reinterpret_cast<char*>(const_cast<uint8_t*>(ptr));
Run Code Online (Sandbox Code Playgroud)
去做.
C++演员和你的内部风格指南都在努力使这看起来很怪异.
您可以通过编写自己的演员来防止重复演员.
template< typename T >
char* awful_monster_cast( const T * ptr )
{
return reinterpret_cast<char*>(const_cast<T*>(ptr));
}
Run Code Online (Sandbox Code Playgroud)
\n\n另一种选择是这个怪物,我觉得它很难读:
\nRun Code Online (Sandbox Code Playgroud)\nchar *cptr = reinterpret_cast<char*>(const_cast<uint8_t*>(aptr));\n
您可能会发现它不可读,但这是在 C++ 中表达此转换的惯用方式。
\n重要的是:
\n总的来说,您的代码需要进行两次转换:\xe2\x80\x94,删除常量性,并转换为有符号类型。如果您想遵守这些编码实践,这要求您进行两次显式表达的转换。您可能不同意这个原则,但您的公司/编码实践肯定同意。
\n当然,我认为没有什么可以阻止你写这样的东西:
\nchar * convert_to_c_data_buffer(uint8_t const* ptr) {\n return reinterpret_cast<char*>(const_cast<uint8_t*>(ptr));\n}\n\nchar* dptr = convert_to_c_data_buffer(aptr);\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1390 次 |
| 最近记录: |