我正在处理第三方库,我想在代码中修改结构。
有第三方结构
struct structure {
const char *c;
// ...
};
我有一个功能
void prep(const structure *s) {
std::string str("hello");
const char *t_c = s->c;
s->c = str.c_str(); // structure::c is a const char *
handle(s); // makes use of overriden c
s->c = t_c; // Set back in case library tries to free/use memory later
}
我如何在这里进行适当的const转换?
答案 0 :(得分:2)
我假设handle
被声明为void handle(const structure*);
。
最简单的解决方案是复制s
,修改副本,然后将其传递给handle
。由于s
为const
,您知道无法对需要传播到原始s
的副本进行任何更改。您还无需将s->c
重置为原始值。
void prep(const structure *s)
{
structure mycopy(*s); // Make a copy of s
std::string str("hello");
mycopy.c = str.c_str(); // structure::c is a const char *
handle(&mycopy); // makes use of overriden c
}
如果您无法复制structure
,请考虑删除const
的{{1}}说明符来修改您的函数声明。如果你只是删除s
,你会得到以下编译好的函数。请注意,生成的函数不是异常安全的。如果const
引发异常,您将无法将handle
成员重置为其原始值。
s->c
如果其他所有方法都失败了,您可以使用const_cast
作为最后的手段。请确保void prep(structure *s)
{
std::string str("hello");
const char *t_c = s->c;
s->c = str.c_str(); // structure::c is a const char *
handle(s); // makes use of overriden c
s->c = t_c; // Set back in case library tries to free/use memory later
}
未指向实际为s
的实例,并确保在const
未处于原始状态时不会引发异常。被迫使用s
可能是糟糕的设计决策的一个指标。
const_cast