围绕缺乏外部库的const-correct性工作
Work around lacking const-correctness of external library
我正在使用缺乏const-correct度的外部C 库。假设我正在使用以下类的对象:
// Library.h
namespace Library {
class Message {
public:
std::string getData() {
return data_;
}
private:
std::string data_;
};
} // namespace Library
请注意,getData()
返回副本,因此对该方法的调用不会更改Message
对象,应为const
。但是,供应商认为不是。在我的代码方面,const-correct度很重要,Message
将用于这样的函数:
// MyApplication.cpp
template<class T>
void handleMessage(const T& msg) {
std::string content = msg.getData();
// interprete and process content ...
}
有没有办法实现这一目标?换句话说,如何在error: passing 'const Library::Message' as 'this' argument discards qualifiers
错误上使用更改handleMessage
函数的签名?
您也可以使用具有可变成员变量的包装器,例如:
#include <string>
class Message {
public:
std::string getData() {
return data_;
}
Message(std::string data): data_{data} { }
private:
std::string data_;
};
class MessageWrapper {
public:
MessageWrapper(Message message): message{message} {}
std::string getData() const {
return message.getData();
}
private:
mutable Message message;
};
template<class T>
void handleMessage(const T& msg) {
std::string content = msg.getData();
}
int main() {
MessageWrapper mw{{"abc"}};
handleMessage(mw);
}
[live demo]
编辑:
强制const正确性,您可以从消息中从消息中保存一旦检索到的数据,例如:
#include <string>
#include <optional>
class Message {
public:
std::string getData() {
return data_;
}
Message(std::string data): data_{data} { }
private:
std::string data_;
};
class MessageWrapper {
public:
MessageWrapper(Message message): message{message} {}
std::string getData() const {
return (data)?(*data):(*(data = message.getData()));
}
private:
mutable Message message;
mutable std::optional<std::string> data;
};
template<class T>
void handleMessage(const T& msg) {
std::string content = msg.getData();
}
int main() {
MessageWrapper mw{{"abc"}};
handleMessage(mw);
}
[live demo]
您基本上有两个选项。您可以使用const_cast
template<class T>
void handleMessage(const T& msg) {
std::string content = const_cast<T&>(msg).getData();
// interprete and process content ...
}
,只要您确定getData
确实不会修改任何成员,就可以了。或者,如果您不介意一些顶部,则可以制作副本:
template<class T>
void handleMessage(const T& msg) {
T copy = msg;
std::string content = copy.getData();
// interprete and process content ...
}
...或作为第三个选项,如果要从呼叫站点隐藏const_cast
,则可以包装它:
class MyMessage {
Message msg;
public:
std::string getData() const {
return const_cast<Message>(msg).getData();
}
};
相关文章:
- 为什么我不能声明一个 constexpr 本地,而一个 const 一个工作?
- 为什么带有 const 关键字的构造函数可以工作,而没有它就不能工作?
- 为什么在CTOR工作中将温度变量传递到const Ref中
- 为什么 vector::erase 不能在带有 const 的类元素上工作
- 'const std::string&s = nullptr' 如何作为可选参数工作
- OpenCV的"calcCovarMatrix"函数中"const Mat*样本"参数的工作原理?
- C++ extern const char* 未按预期工作
- STD ::配对的const引用如何工作
- 围绕缺乏外部库的const-correct性工作
- C++ 为什么我的覆盖代码 const int x = *(&y);工作?
- 返回const lvalue引用rvalue临时?为什么这项工作
- 带有 Qt 的正则表达式 - indexIn(const QString &) 无法按预期工作
- const char*和字符串比较在C++中是如何工作的
- 在const 2D数组上支持my_2D_Array[x][y](双运算符[]);无法使事情正常工作
- std::map::erase(const key_type&) 比较自定义后停止工作
- 带有 const int* const 的 scanf 可以工作,但不应该
- const和volatile的重载——为什么它可以通过引用工作
- QOpenGLFunctions not const correct
- 为什么很少有人输入常量正确的代码?将const-correct代码编译更好/更快
- 传递常量引用…它像最重要的const一样工作吗