c++ - 具有可变返回类型的 C++ 访问者模式
问题描述
我有以下设置:
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++ 中是不可能的,因为虚函数IVistitable::accept()
不能被模板化。
有人知道绕过这个限制的方法吗?
解决方案
几个选项:
不要返回任何东西,处理访问者内部的值。访问者可以完全自由地存储或处理任何返回值和类型。
返回可变参数类型(
std::any
或std::variant
)。请注意,使用它们需要您找出实际类型,这可能与您的原始问题有点相似。继承多个
IVisitor<>
接口。这甚至可能是最简单的方法,尽管它不一定是优雅的。
推荐阅读
- python - 使用 PyTorch 进行二进制分类的目标和输出形状/类型
- postgresql - 选择子句,其中 id 在 json 数组中
- android - HTML5 视频未在 android webview 中播放
- javascript - 基于单选按钮选择显示不同的视图页面
- codeigniter - Nginx + CodeIgniter 发布到控制器 500 错误
- r - 如何在 R Dataframe 中获取以前的最新行
- javascript - 如何监控 Javascript 函数的性能?
- javascript - 如何知道 match(50) 和 match(0) 的值?
- javascript - RegEx /href=.+"/g 重复匹配"
- reactjs - 修复 react-pdf 上的 CORS 问题