gpt4 book ai didi

c++ - 非循环访问者 C++

转载 作者:行者123 更新时间:2023-12-05 07:44:45 25 4
gpt4 key购买 nike

我正在阅读 Alexandrescu 的书,我遇到了非循环访问者模式。我认为可以摆脱调用 BaseVisitable 类的 AcceptImpl 方法的宏。请问下面的实现是否符合标准?

class BaseVisitor
{
public:
virtual ~BaseVisitor() {}
};

template <class SpecificVisitable>
class SpecificVisitor
{
public:
virtual void Visit(SpecificVisitable& t) = 0;

protected:
~SpecificVisitor() {}
};

template <class SpecificVisitable>
class BaseVisitable
{
public:
void Accept(BaseVisitor& visitor)
{
SpecificVisitor<SpecificVisitable>& specificVisitor = dynamic_cast<SpecificVisitor<SpecificVisitable>&>(visitor);
specificVisitor.Visit(static_cast<SpecificVisitable&>(*this));
}
protected:
~BaseVisitable() {}
};

class A : public BaseVisitable<A>
{
public:
void PrintA() { std::cout << "A\n"; }
};

class B : public BaseVisitable<B>
{
public:
void PrintB() { std::cout << "B\n"; }
};

class PrintVisitor final:
public BaseVisitor,
public SpecificVisitor<A>,
public SpecificVisitor<B>
{
public:
virtual void Visit(A& a) override
{
a.PrintA();
}

virtual void Visit(B& b) override
{
b.PrintB();
}
};

int main()
{
A a;
B b;

PrintVisitor visitor;
a.Accept(visitor);
b.Accept(visitor);
}

最佳答案

我同意原始帖子的评论者的观点,即对引用的 dynamic_cast 将失败。您没有测试这种情况,因此您的代码当然可以正常工作。但是,在一般情况下,这是错误的。

我建议您改为重写 BaseVisitable 以转换为指针并在派发之前检查该指针。有点像

if (auto sv = dynamic_cast<SpecificVisitor<SpecificVisitable>*>(visitor))
sv->visit(*this)

关于c++ - 非循环访问者 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42575593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com