gpt4 book ai didi

具有可变返回类型的 C++ 访问者模式

转载 作者:行者123 更新时间:2023-12-02 18:34:16 25 4
gpt4 key购买 nike

我有以下设置:

class IVisitor{
public:
virtual SomeType visit(IVisitable& visitable) = 0;
};

class IVisitable{
public:
virtual SomeType accept(IVisitor& visitor) = 0;
};

class ConcreteVisitor : public IVisitor{
public:
SomeType visit(IVisitable& visitable) override {
return calculateSomeStuff();
}
};

class ConcertVisitable : public IVisitable{
public:
SomeType accept(IVisitor& visitor) override {
return visitor.visit(*this);
}
};

但我希望不同的访问者返回不同的类型。为此,IVisitable::accept() 也应该返回不同的类型。

这将导致以下(不正确的)代码:

template <typename R>
class IVisitor{
public:
virtual R visit(IVisitable& visitable) = 0;
};

class IVisitable{
public:
template <typename R>
virtual R accept(IVisitor<R>& visitor) = 0;
};

class ConcreteVisitorOne : public IVisitor<int>{
public:
int visit(IVisitable& visitable) override {
return calculateSomeStuff();
}
};

class ConcreteVisitorTwo : public IVisitor<bool>{
public:
bool visit(IVisitable& visitable) override {
return calculateSomeStuff();
}
};

class ConcertVisitable : public IVisitable{
public:
int accept<int>(IVisitor<int>& visitor) override {
return visitor.visit(*this);
}
};

不幸的是,这在 C++ 中是不可能的,因为 virtual 函数 IVistitable::accept() 不能被模板化。

有人知道解决此限制的方法吗?

最佳答案

几个选项:

  • 不返回任何东西,处理访问者内部的值。访问者可以完全自由地存储或处理任何返回值和类型。

  • 返回可变类型(std::anystd::variant)。请注意,使用它们需要您找出实际类型,这可能与您原来的问题有点相似。

  • 继承多个IVisitor<>接口(interface)。这甚至可能是最简单的方法,尽管它不一定优雅。

关于具有可变返回类型的 C++ 访问者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69004879/

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