我想使用C ++格式进行此转换,它适用于C方式。但是当我尝试C ++格式时它失败了。
有效!
void req_password(const void *data, size_t datalen)
{
char *password_old = ((char **) data)[0];
char *password_new = ((char **) data)[1];
...
}
失败
void req_password(const void *data, size_t datalen)
{
char *password_old = (const_cast<char **>(data))[0];
char *password_old = (const_cast<char **>(data))[1];
...
}
错误:
error: invalid const_cast from type 'const void*' to type 'char**'
所以我怀疑,我怎么能用C ++方式进行这种转换呢?
PS:这段代码是API的一部分,我无法控制数据的输入。
答案 0 :(得分:3)
<强>唐&#39;吨强>
如果您获得了不可变数据,那么您将获得不可变数据,这就是它的结束!
首先,这是我建议的最大安全性。将data
强制转换为真实类型有点棘手,唉:
void req_password(const void* data, size_t datalen)
{
const char* password_old = (reinterpret_cast<const char* const*>(data)[0]);
const char* password_new = (reinterpret_cast<const char* const*>(data)[1]);
// ...
}
(我实际上在上面添加了一些const
,因为它似乎是首先拥有const void*
的目的。)< / p>
但是,如果确实希望字符串是可变的,那么这也很好:
void req_password(const void* data, size_t datalen)
{
char* password_old = (reinterpret_cast<char* const*>(data)[0]);
char* password_new = (reinterpret_cast<char* const*>(data)[1]);
// ...
// More obvious when you recall that `const void*` is actually `void const*`;
// So:
// void const*
// becomes:
// char* const*
}
请注意您在此处 const_cast
,因为您并未修改data
指向的内容:您正在取消引用它并得到它的支持。
当然,理想情况下,data
会指向const std::string
个实例。