假设你有一些类似的课程Circle
, Image
, Polygon
为此,您需要强制执行一个如下所示的通用接口(不是真正的代码):
struct Interface {
virtual bool hitTest(Point p) = 0;
virtual Rect boundingRect() = 0;
virtual std::string uniqueId() = 0;
}
例如Circle
班级想要:
struct Circle {
// interface
bool hitTest(Point p) override;
Rect boundingRect() override;
std::string uniqueId() override;
double radius() const;
Point center() const;
// other stuff
}
我想用std::variant<Circle, Image, Polygon>
将我的类的实例存储在std::vector
然后像这样使用它:
using VisualElement = std::variant<Circle, Image, Polygon>;
std::vector<VisualElement> elements;
VisualElement circle = MakeCircle(5, 10);
VisualElement image = MakeImage("path_to_image.png");
elements.push_back(circle);
elements.push_back(image);
auto const &firstElement = elements[0];
std::cout << firstElement.uniqueId() << std::endl;
使用继承,我可以通过创建一个基类来做到这一点,然后我的每个类都将成为基类的子类(显然,如果派生类没有实现该程序将无法编译的接口)。然后,我可以使用智能指针将实例存储在向量中,而不是使用变体(例如std::vector<std::unique_ptr<BaseElement>>
)。我想避免这种情况,所以我想知道使用以下命令强制执行相同设计的最佳方法(如果有的话)是什么std::variant
和 C++20。