如何消除访客模式冗余?
Way to remove visitor pattern redundancy?
所以我第一次尝试访问者模式,想知道为什么我必须为每个派生类多次编写 accept 函数。
class object
{
public:
virtual void accept(visitor *v) { v->visit(this); }
// ....
};
class derived : public object
{
public:
void accept(visitor *v) override { v->visit(this); } // redundancy in my eyes!!
// ...
};
我真的必须为每个可访问对象定义该接受函数吗?有没有办法在基类中只写一次,并让它引用特定的派生类指针而不必强制转换?
不多余的是*this
的类型。在基类中,*this
的类型为object
。在派生类中,*this
的类型为derived
。这种差异使访客模式有用。
借助 CRTP,您可以避免在所有派生类中重新实现函数:
class base_acceptor{
public:
virtual void accept(visitor *v) {v->accept(*this);}
};
template<class Derived, class...Bases>
class acceptor_implementer
: public Bases...
{
void accept(visitor *v) override {
assert(dynamic_cast<Derived*>(this)!=nullptr);
v->accept(static_cast<Derived&>(*this));
}
};
class acceptor1
:acceptor_implementer<acceptor1,base_acceptor>
{};
class acceptor2
:acceptor_implementer<acceptor2,base_acceptor>
{};
class acceptor11
:acceptor_implementer<acceptor11,acceptor1>
{};
相关文章:
- 如何擦除冗余输入?
- 使用提升几何缓冲区缩放多边形时的冗余折点
- 我应该担心冗余声明吗?
- Qt的slot(?)将冗余命名空间插入连接
- 方法冗余移动调用的移动语义
- 使用 llvm 和本地值编号算法擦除冗余表达式
- 优化堆上创建的冗余变量
- 如何消除访客模式冗余?
- 表达式模板需要冗余重载
- C++,处理多个构造函数重载和冗余代码
- 使用模板基类消除工厂类派生类冗余的干净方法
- 连接两个文件时如何避免冗余尾随换行符?
- CMake:修改共享库时的冗余链接
- 提升精神 X3:"属性没有预期的大小"冗余
- 如何简化此冗余C++代码?
- 是``if`语句''在modulo之前和分配操作之前的冗余
- 使用最终类说明符时,最终函数说明符是否冗余?
- 简化冗余std :: array初始化,当时没有constexpr构造函数
- 尝试使用 OpenMP 并行化递归函数的冗余计算
- 用户界面-GUI和文本模式C++设计,以消除冗余(可选参数?功能过载?)