C++中的保留签名的装饰器图案
Signature-preserving Decorator Pattern in C++?
我想在C++中使用装饰器模式,并且仍然能够依赖装饰对象的签名/身份。可以在C++做到吗?
也就是说,我想装饰一个组件:
class Component {
public:
Component();
virtual void doSomething();
}
带装饰器:
class Decorator : public Component {
public:
Decorator(Component*);
virtual void doSomething();
private:
Component* _component;
}
这样当我这样做时:
Component foo;
Decorator(&foo) bar;
std::cout << typeid(bar).name() << std::endl;
它打印"组件"而不是"装饰器"。
(这实际上非常简单,使用装饰器模块在 Python 中完成,但我目前正在学习C++,甚至不知道从哪里开始寻找这个问题的答案。
如果我想扩展 Component 类但仍能够以透明的方式使用它(好像它不会被扩展),这很有用:
class ExtendDecorator : public Decorator {
public:
ExtendDecorator(Component*);
virtual void doSomething();
private:
void doSomethingMore();
}
void ExtendDecorator::doSomething() {
Decorator::doSomething();
doSomethingMore();
}
由于C++不允许重载运算符typeid - 我可以提出的唯一解决方案是为装饰类型添加返回type_info的虚拟方法:
class Component {
public:
Component();
virtual void doSomething();
virtual const std::type_info& decorated_type() const
{ return typeid(*this); }
};
class Decorator : public Component {
public:
Decorator(Component*);
virtual void doSomething();
virtual const std::type_info& decorated_type() const
{ return typeid(*_component); }
private:
Component* _component;
};
也许更好的版本Decorator::decorated_type() const
:
virtual const std::type_info& decorated_type() const
{ return _component->decorated_type(); }
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 为多个会话保留XPtr
- 保留对其他类的成员函数的引用
- 指针保留字符串
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 如何让 GCC/Clang 在保留标识符上出错
- 必须为 C++20 协程帧保留多少内存?
- 如何将一个窗口保留在另一个应用程序窗口的前面
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 局部变量保留函数中的值
- 保留函数指针模板参数
- 变量超出范围后如何保留向量值?
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 当为可变性配置时,boost::heap::d_ary_heap 保留的额外 std::list 的目的是什么?
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 即使在使用 delete[] 后仍保留的元素
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 将成员函数保留为未定义
- C++:如何为多个重载函数保留通用代码路径?
- C++ 删除存在于另一个矢量中的矢量项,同时保留顺序