Virtual template function with templated return value workaround
关于必须是虚拟的模板化函数的解决方法的问题在这里很常见,尽管我找不到任何有助于解决我的问题的方法,这是这个问题的一个简单变体:需要一个虚拟模板成员解决方法
建议的方法是使用类型擦除,从而得到一个非常干净和简单的解决方案。但是,如果我需要从
现在想象一下这段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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(); } |
我们仍然需要使用EDOCX1[1]模板化,即使在应用了类型擦除技巧之后。还有什么想法吗?
注意:我不能使用基类作为返回值,正如在关于so的一些答案中所建议的那样,因为t也可以代表任何基类型(int、string等)。
型
你基本上有两个选择:
百万千克1
为
百万千克1百万千克1
将键入的结果存储在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // a void visitor struct ShapePrinter : IShapeVisitor { void visit(const Square&) override { std::cout <<"Square"; } void visit(const Circle&) override { std::cout <<"Circle"; } }; // a double visitor struct ShapePerimeterComputer : IShapeVisitor { void visit(const Square& square) override { perimeter = 4. * square.sideLength; } void visit(const Circle& circle) override { perimeter = 2. * M_PI * circle.radius; } double perimeter = 0.; }; |
百万千克1