我有一个声明常量和非常量成员函数的抽象类。为了讨论起见,让我们说它看起来像这样:
class record_interface
{
public:
virtual ~record_interface() = default;
virtual void set_foo(BoundedFloat) = 0;
virtual BoundedFloat get_foo() const = 0;
};
Run Code Online (Sandbox Code Playgroud)
这用作记录的高级表示,当保存到光盘并通过线路传输时,该记录具有不同的表示。所以大多数实现只需要将它们的成员转换为所需的高级表示。
作为有效实现的示例,让我们定义stored_record. 这用于以有损格式存储高级记录:
struct stored_record
{
int16_t foo;
};
Run Code Online (Sandbox Code Playgroud)
stored_record可以实现是有道理的,record_interface但由于各种原因它不能(例如,它需要是trivially_copyable)。我们可以制作一个为其实现接口的包装器:
class record_wrapper : public record_interface
{
public:
record_wrapper(stored_record & wrapped)
: wrapped_(wrapped) {}
void set_foo(BoundedFloat value) final { wrapped_.foo = convert_to_int16(value); }
BoundedFloat get_foo() const final { return convert_from_int16(wrapped_.foo); }
private:
stored_record & wrapped_;
};
Run Code Online (Sandbox Code Playgroud)
现在的问题是当给定 a 时我们不能使用包装器,const stored_record &因为包装器存储了一个可变引用。我们也不能让它存储非常量引用,因为它无法实现非常量 …