【发布时间】:2016-07-29 13:44:51
【问题描述】:
关于必须为虚拟的模板化函数的变通办法的问题在这里很常见,尽管我找不到任何有助于解决我的问题的方法,这是这个问题的一个简单变体:need a virtual template member workaround
建议的方法是使用类型擦除,从而获得非常干净和简单的解决方案。但是,如果我需要从visit() 方法返回一个值怎么办? OP 在他的问题中已经有了这个方面,但是由于他从未使用过结果,因此在解决方案中被忽略了。
现在想象一下这段代码:
template <typename T>
class BaseVisitor {
public:
BaseVisitor();
T visit(BaseVisited *visited);
virtual ~BaseVisitor();
}
class BaseVisited {
BaseVisited();
template <typename T>
virtual T accept(BaseVisitor<T> *visitor) { return visitor->visit(this); };
virtual ~BaseVisited();
}
我们仍然需要对accept() 进行模板化,即使在应用了类型擦除技巧之后也是如此。还有什么想法吗?
注意:我不能使用基类作为返回值,正如一些关于 SO 的答案所建议的那样,因为 T 也可以代表任何基类型(int、string 等)。
【问题讨论】:
-
如果你不习惯封闭类型系统(例如
std::variant<>)和类型擦除(例如boost::any、void*),你唯一的选择可能是throw T(...);而不是@ 987654329@
标签: c++ templates visitor-pattern